具有entity framework6的多对多通用更新方法
我在抽象的DatabaseOperations
类中有一个用于Entity Framework的通用Update
方法:
public virtual void Update(T updatedObject, int key) { if (updatedObject == null) { return; } using (var databaseContext = new U()) { databaseContext.Database.Log = Console.Write; T foundEntity = databaseContext.Set().Find(key); databaseContext.Entry(foundEntity).CurrentValues.SetValues(updatedObject); databaseContext.SaveChanges(); } }
但是,这不能处理多对多关系。
通过覆盖TrussSetDatabaseOperations : DatabaseOperations
的Update
方法可以克服这种多对多更新问题TrussSetDatabaseOperations : DatabaseOperations
,如下所示:
public override void Update(TrussSet updatedTrussSet, int key) { if (updatedTrussSet == null) { return; } using (var databaseContext = new TrussManagementDatabaseContext()) { databaseContext.Database.Log = Console.Write; TrussSet foundTrussSet = databaseContext.TrussSets.Find(key); databaseContext.Entry(foundTrussSet).CurrentValues.SetValues(updatedTrussSet) // Update the many-to-many relationship of TrussSets to Seals databaseContext.Entry(foundTrussSet).Collection(trussSet => trussSet.Seals).Load(); databaseContext.Entry(foundTrussSet).Collection(trussSet => trussSet.Seals).CurrentValue = updatedTrussSet.Seals; databaseContext.SaveChanges(); } }
但是,这种重写会扩散到从DatabaseOperations
inheritance并具有TrussSet对象的所有类。 我可以以某种方式将添加的两行注入到通用更新方法中,以便为update方法提供集合属性,加载它们,并将相应的更新集合应用于该实体吗? 提前致谢。
查看您的代码,可以想到以下内容:
public virtual void Update(T updatedObject, int key, params string[] navigationProperties) { if (updatedObject == null) { return; } using (var databaseContext = new U()) { databaseContext.Database.Log = Console.Write; T foundEntity = databaseContext.Set().Find(key); var entry = databaseContext.Entry(foundEntity); entry.CurrentValues.SetValues(updatedObject); foreach (var prop in navigationProperties) { var collection = entry.Collection(prop); collection.Load(); collection.CurrentValue = typeof(T).GetProperty(prop).GetValue(updatedObject); } databaseContext.SaveChanges(); } }
如果您想要更多类型安全性,也可以使用表达式而不是字符串(然后从这些表达式中提取属性名称)。
更新:在这种情况下,我的意思是“使用表达式”:
public virtual void Update(T updatedObject, int key, params Expression>[] navigationProperties) { if (updatedObject == null) { return; } using (var databaseContext = new U()) { databaseContext.Database.Log = Console.Write; T foundEntity = databaseContext.Set().Find(key); var entry = databaseContext.Entry(foundEntity); entry.CurrentValues.SetValues(updatedObject); foreach (var prop in navigationProperties) { string memberName; var member = prop.Body as MemberExpression; if (member != null) memberName = member.Member.Name; else throw new Exception("One of the navigationProperties is not a member access expression"); var collection = entry.Collection(memberName); collection.Load(); collection.CurrentValue = typeof (T).GetProperty(memberName).GetValue(updatedObject); } databaseContext.SaveChanges(); } }