所以我想为LINQ to SQL编写一个通用的Upsert函数,我在构思它的过程中遇到了一些麻烦.我希望它能像这样工作:
var db = new DataContext(); db.Customers.UpsertOnSubmit(customer);
所以它必须在某种程度上是通用的,我猜和表上的扩展方法.在确定基础表的主键时,我已经能够做到这一点:
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 entity) where Ta: class { if (!(entity is IEntity)) throw new Exception("T must be of type IEntity"); if (((IEntity)entity).EntityState == EntityState.Exisiting) GetTable ().Attach(entity, true); else GetTable ().InsertOnSubmit(entity); } private System.Data.Linq.Table GetTable () where Ta: class { return _dataContext.Context.GetTable (); }
如果从另一个datacontext附加,还要确保在对象上有时间戳.