因此,我想为LINQ to SQL编写一个通用的Upsert函数,但是在概念上很难做到这一点。我希望它能像这样工作:
var db = new DataContext();
db.Customers.UpsertOnSubmit(customer);
因此,它在某种程度上必须是通用的,我想是对Table的扩展方法。我已经能够确定基础表的主键了:
var context = source.Context;
var table = context.Mapping.GetTable(source.GetType());
var primaryMember = table.RowType.DataMembers.SingleOrDefault(m => m.IsPrimaryKey);
我假设有必要使它组成一个查询,以告知该项目是否已在数据库中,但是我现在真的不知道该如何处理。
最佳答案
我做了类似的事情,但是使用了不同的方法。每个实体都实现IEntity
。 IEntity
的属性之一是对象是新对象还是现有状态。然后,我为每个实体实现该功能,例如:
public EntityState EntityState
{
get
{
if (_Id > 0)
return EntityState.Exisiting;
else
return EntityState.New;
}
}
然后,通用
Upsert
可以是(在通用存储库类型类上):public virtual void Upsert<Ta>(Ta entity)
where Ta: class
{
if (!(entity is IEntity))
throw new Exception("T must be of type IEntity");
if (((IEntity)entity).EntityState == EntityState.Exisiting)
GetTable<Ta>().Attach(entity, true);
else
GetTable<Ta>().InsertOnSubmit(entity);
}
private System.Data.Linq.Table<Ta> GetTable<Ta>()
where Ta: class
{
return _dataContext.Context.GetTable<Ta>();
}
如果您是从另一个数据上下文附加的,还请确保您的对象带有时间戳。
关于linq - 您将如何编写LINQ to SQL的Upsert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/637225/