Linq使用实体框架“添加新”和“删除旧”对象

时间:2013-11-23 14:21:31

标签: c# linq entity-framework

我一直试图解决一个问题,似乎无法找到任何有用的东西......

在我的MVC应用程序中,我收到一个地址对象,其中包含与之关联的逗号分隔的名称字符串。 例如:

public class address
{
    public string Names { get; set; }    //-- "Name-One,Name-Two,Name-Three"
}

在我的服务层中,我将此列表拆分为字符串数组。

现在使用实体框架我需要预先形成三个任务

1)创建要存储在数据库中的新Name对象,并将它们添加到地址中。

2)从数据库中删除旧名称对象,并将其从地址中删除。

3)提交更改,以便将地址对象链接到新的多个名称对象列表。

有没有人有任何想法如何在没有达到数据库的情况下这样做。 (避免每个循环无穷无尽)

提前致谢

1 个答案:

答案 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

然后,您可以迭代字符串数组并将新实体添加到集合中。

最后,保存更改。所有内容都将被删除并添加到单个数据库往返中。