3

我的领域课程:

public class Address
{
    [Key]
    public virtual string AddressId { get; set; }

    public virtual Site Site { get; set; }
}

public class Site
{
    [Key]
    public virtual int SiteId { get; set; }

    public virtual Address Address { get; set; }
}

使用 Fluent API 进行映射:

public class SiteMappings : EntityTypeConfiguration<Site>
{
    public SiteMappings()
    {
        HasRequired(s => s.Address)
        .WithOptional(a => a.Site)
        .Map(s => s.MapKey("AddressId"))
        .WillCascadeOnDelete(false);
    }
}

种子方法:

var addresses = new List<Address>
{
    new Address { AddressId = "1" }
};
addresses.ForEach(s => context.Addresses.AddOrUpdate(p => p.AddressId, s));

var sites = new List<Site>
{
    new Site { SiteId = 1, Address = addresses.Single(s => s.AddressId.Equals("1"))}
};
sites.ForEach(s => context.Sites.AddOrUpdate(p => p.SiteId, s));

错误:

Violation of PRIMARY KEY constraint 'PK_dbo.Addresses'. Cannot insert duplicate key in object 'dbo.Addresses'. The duplicate key value is (1)

似乎是当我尝试添加一个新的“站点”时,新的“地址”也会被插入。如何避免这种情况?如何在我之前添加的 DBcontext 中插入现有的“地址”。我是 Entity Framework 的新手,非常感谢您的帮助。提前致谢!

4

2 回答 2

2

将地址分配给站点实例后,对每个地址实例使用此地址:

context.Entry(existingAddress).State = EntityState.Unchanged;

这会将地址的状态设置为Unchanged而不是,Added并且 EF 不会尝试再次添加它们。

也尝试context.SaveChanges()在添加地址的 ForEach 之后调用。

于 2014-07-28T04:40:25.927 回答
1

我能够通过插入由当前上下文管理的“地址”来解决这个问题。

new Site { SiteId = 1, Address = context.Addresses.FirstOrDefault(a => a.AddressId.Equals("1"))}

下面的代码将利用当前上下文管理的现有“地址”,而不是尝试插入新的“地址”。

context.Addresses.FirstOrDefault(a => a.AddressId.Equals("1"))}
于 2014-07-28T11:16:51.863 回答