具有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 : DatabaseOperationsUpdate方法可以克服这种多对多更新问题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(); } } 

但是,这种重写会扩散到从DatabaseOperationsinheritance并具有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(); } }