实体框架-在seed方法中为一对一关系添加一个现有实体
本文关键字:实体 一个 添加 一对一 框架 seed 方法 关系 | 更新日期: 2023-09-27 18:15:22
我的域类:
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中插入一个现有的"地址"。我是实体框架的新手,非常感谢您的帮助。提前感谢!
将地址分配给站点实例后,对每个地址实例使用此地址:
context.Entry(existingAddress).State = EntityState.Unchanged;
这将地址的状态设置为Unchanged
而不是Added
, EF将不会尝试第二次添加它们。
也试着在ForEach之后调用context.SaveChanges()
,在那里你添加地址。
我可以通过插入一个由当前上下文管理的"Address"来解决这个问题。
new Site { SiteId = 1, Address = context.Addresses.FirstOrDefault(a => a.AddressId.Equals("1"))}
下面的代码将使用当前上下文管理的现有"Address",而不是尝试插入新的"Address"。
context.Addresses.FirstOrDefault(a => a.AddressId.Equals("1"))}