c# - Entity Framework - 将现有实体添加到种子方法中的一对一关系

标签 c# entity-framework dbcontext entity-framework-migrations ef-fluent-api

我的领域类:

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 的新手,非常感谢您的帮助。 提前致谢!

最佳答案

将地址分配给站点实例后,将其用于每个地址实例:

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

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

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

关于c# - Entity Framework - 将现有实体添加到种子方法中的一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24988249/

相关文章:

c# - 为什么 XmlSerializer 在映射具有相同名称但不同命名空间的类的对象图时无法初始化?

c# winforms - 在模式窗体之间传递参数

c# - 自定义 Avalonia 控件从其他线程性能问题渲染

c# - 带有可选参数的 Entity Framework ?

entity-framework - 是否有使用 Fluent API 的 C# EF6 DbContext 生成器?

c# - EF Core DB 上下文跟踪生命周期和范围

entity-framework - 如何聚合存储库?

c# - 如何循环MoveTowards?

c# - 错误 :The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

c# - 将 EF 查询限制为具有 TPT 继承的基类型