我一直试图解决一个问题,似乎无法找到任何有用的东西......
在我的MVC应用程序中,我收到一个地址对象,其中包含与之关联的逗号分隔的名称字符串。 例如:
public class address
{
public string Names { get; set; } //-- "Name-One,Name-Two,Name-Three"
}
在我的服务层中,我将此列表拆分为字符串数组。
现在使用实体框架我需要预先形成三个任务
1)创建要存储在数据库中的新Name对象,并将它们添加到地址中。
2)从数据库中删除旧名称对象,并将其从地址中删除。
3)提交更改,以便将地址对象链接到新的多个名称对象列表。
有没有人有任何想法如何在没有达到数据库的情况下这样做。 (避免每个循环无穷无尽)
提前致谢
杰
答案 0 :(得分:2)
string[] newNames = ServiceLayerSplitCommaSeparatedIntoArray(addressObj);
var entity = dbContext.Set<Address>().Find(addressId);
entity.Names.Clear();
foreach (var newName in newNames)
entity.Names.Add(new AddressName {
Value = newName,
});
dbContext.SaveChanges();
我认为最有效的方法是将您的任务完成为2,然后是1,然后是3.
entity.Names.Clear()
行将从地址中删除所有旧的Name对象。只要这些实体具有地址实体所需的外键,它们也将从数据库中删除。否则,如果他们有可选的外键,您可以这样做从数据库中删除它们(而不是Clear
集合上的Names
):
var oldNames = entity.Names.ToArray();
foreach (var oldName in oldNames)
dbContext.Set<AddressName>().Remove(oldName);
//entity.Names.Clear(); // Remove calls above will clear these automatically
然后,您可以迭代字符串数组并将新实体添加到集合中。
最后,保存更改。所有内容都将被删除并添加到单个数据库往返中。