首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF6多到多插入

EF6多到多插入
EN

Stack Overflow用户
提问于 2016-02-19 08:12:19
回答 1查看 252关注 0票数 0

我的问题是在EF6的代码优先数据库中保存现有对象,这些对象是多到多关系的一部分。

我正在接收来自web服务的对象,它们看起来(简化)如下:

代码语言:javascript
复制
public class Car
{
    [DataMember]
    public virtual string CarId { get; set; }

    [DataMember]
    public virtual ICollection<Contract> Contracts { get; set; }
}

public class Contract
{   
    [DataMember]
    public virtual string ContractId { get; set; }

    [DataMember]
    public virtual ICollection<Car> Cars { get; set; } 
}

我有一个代码优先数据库,并设置了以下关系:

代码语言:javascript
复制
        modelBuilder.Entity<Contract>().HasKey(t => new {t.ContractId});
        modelBuilder.Entity<Car>().HasKey(t => new {t.CarId})
            .HasMany(c => c.Contracts)
            .WithMany(c => c.Cars)
            .Map(x =>
            {
                x.ToTable("CarContracts");
                x.MapLeftKey("CarId");
                x.MapRightKey("ContractId");
            });

当我得到一个汽车列表,我可以保存第一个汽车和EF创建关系表和合同成功。在第二个car上,保存失败,上面写着“约束失败,唯一约束失败: Contracts.ContractId",因为我试图插入一个与已经存在的合同具有相同IdContract

我找到的解决这个问题的方法是将dbContext中的dbContext设置为附件:

代码语言:javascript
复制
foreach (var contract in car.Contracts)
{
    context.Contract.Attach(contract);
}

这将引发与上次保存相同的异常。当我试图修改第二辆车的合同列表时,我得到了一个NotSupportedException,我能想到的唯一解决方案就是重新创建汽车对象并将相同的合同对象附加到它们上,这似乎是不必要的复杂。

有没有办法告诉EF,我的两个不同的合同对象实际上是相同的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-19 09:01:38

有没有办法告诉EF,我的两个不同的合同对象实际上是相同的?

唯一的办法是,它们实际上是同一个物体。如果它们是不同的实例,即使拥有所有相同的数据,EF也不会将它们识别为同一个实体。

因此,唯一的解决方案是将所有相同的id契约实例替换为一个单独的实例。

或者更简单:创建一个表示N:N关系的显式实体,然后简单地构建一个列表以插入如下:

代码语言:javascript
复制
var toInsert = new List<CarContract>();
foreach(var car in cars)
{
    toInsert.AddRange(car.Select(x=>new CarContract {CarId=car.Id,ContractId=x.Id}));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35500392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档