【问题标题】:Entity Framework - adding an existing entity to one to one relationship in seed method实体框架 - 在种子方法中将现有实体添加到一对一关系
【发布时间】:2014-07-28 04:02:45
【问题描述】:

我的域类:

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

【问题讨论】:

  • 您好,我遇到了类似的问题。我有类似的课程,我试图从 Model2s 的下拉列表中保存一个带有所选选项的 Model1。我的错误是“'Mydbcontext' 中的实体参与了 'model1_model2' 关系。找到了 0 个相关的 'model1_model2_Target'。预计有 1 个 'model1_model2_Target'”它是一对一的关系。
  • 我能够通过插入一个由当前上下文管理的“地址”来解决这个问题。 new Site { SiteId = 1, Address = context.Addresses.FirstOrDefault(a =&gt; a.AddressId.Equals("1"))}

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


【解决方案1】:

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

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

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

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

【讨论】:

  • Attaching an entity of type 'TransportManagementSystem.Models.Address' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.
  • 见我上面的编辑。顺便说一句,为什么你的AddressId 是一个字符串而不是int,因为你给它分配了一个值1?这是一个错误还是设计使然?
  • 我试过 addresses.ForEach(s =&gt; context.Addresses.AddOrUpdate(p =&gt; p.AddressId, s)); context.SaveChanges(); var sites = new List&lt;Site&gt; { new Site { SiteId = 1, Address = addresses.Single(s =&gt; s.AddressId.Equals("1"))} }; sites.ForEach(s =&gt; context.Sites.AddOrUpdate(p =&gt; p.SiteId, s)); context.Entry(addresses.Single(s =&gt; s.AddressId.Equals("1"))).State = EntityState.Unchanged; context.SaveChanges(); 错误:“TransportManagementSystem.Models.Address”类型的多个实体具有相同的主键值
【解决方案2】:

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

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

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

context.Addresses.FirstOrDefault(a => a.AddressId.Equals("1"))}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多