C# 添加、删除和更新相关实体
简化后,我有一个实体框架,将两个表映射到对象:C# 添加、删除和更新相关实体,c#,entity-framework,C#,Entity Framework,简化后,我有一个实体框架,将两个表映射到对象:项和属性。每个项目都有特定的属性(一对多) 从程序外部,我接收带有属性的“死”项,这些属性是新项或现有项的更新及其属性。这些数据可能来自一个WCF调用、一个web表单帖子、一个反序列化:关键是我想用我收到的未链接的数据在数据库中插入和更新项和属性 我发现了各种各样的(并非全部)。问题是我必须编写大量代码来同步现有项和传入的更新项的属性: private static void UpdateProperties(Item existingItem, I
项
和属性
。每个项目都有特定的属性(一对多)
从程序外部,我接收带有属性的“死”项,这些属性是新项或现有项的更新及其属性。这些数据可能来自一个WCF调用、一个web表单帖子、一个反序列化:关键是我想用我收到的未链接的数据在数据库中插入和更新项和属性
我发现了各种各样的(并非全部)。问题是我必须编写大量代码来同步现有项和传入的更新项的属性:
private static void UpdateProperties(Item existingItem, Item updatedItem, TestdatabaseEntities context)
{
// Find deleted properties
foreach (var existingProp in existingItem.Properties.ToList()) // ToList() to work on a local copy, otherwise you'll be removing items from an enumeration
{
var inUpdate = updatedItem.Properties.Where(p => p.Name == existingProp.Name).FirstOrDefault();
if (inUpdate == null)
{
// Property with this Name was not found as property in the updated item, delete it
context.Properties.DeleteObject(existingProp);
}
}
// Find added or updated properties
foreach (var updatedProp in updatedItem.Properties)
{
var inDatabase = existingItem.Properties.Where(p => p.ItemID == existingItem.ID && p.Name == updatedProp.Name).FirstOrDefault();
if (inDatabase == null)
{
// Added
inDatabase = new Property { Name = updatedProp.Name };
existingItem.Properties.Add(inDatabase);
}
// Updated ( & added), map properties (could be done with something like AutoMapper)
inDatabase.Value = updatedProp.Value;
// etc...
}
context.SaveChanges();
}
你看,有各种对对象特定属性的引用(existingItem.properties
,p.Name==existingProp.Name
,p.ItemID==existingItem.ID
),但是可以构建此方法的更通用版本,甚至可以在一点递归中进行修改(如果属性
本身引用了其他实体怎么办?)
然而,我想知道:这(整个过程或部分过程)能更容易地完成吗?不,我不能从一个项目中删除所有属性并在更新时重新添加它们,因为这些实体中还有其他数据我想保留。作为开发人员,编写代码是你的工作:),而这不是“大量代码”
没有处理此代码的全局通用方法。您可能会找到一种方法来概括您的示例,但它仍然会针对特定的情况进行定制。您的简单方法包含大量代码,这些代码与
项
和属性
类紧密耦合。泛化此代码需要在方法之外注入处理这些依赖项的委托或表达式 作为一名开发人员,我的工作就是不断地思考“这能以更好的方式完成吗?”,因此我提出了一个问题我希望有一种更通用的方法来解决这个问题,最好是内置在EF中,因为正如我所说的,这是一个简化的示例,我不想重复我的代码。没有EF不包含任何内置机制来解决这个问题-这是我的分析。我已经找到了那个很棒的帖子,现在我发现我忘记在我的问题中链接到它了。无论如何,谢谢你。