【发布时间】:2022-04-25 18:41:51
【问题描述】:
我无法添加交易实体,因为买家和卖家引用的是同一个城市“City1”。 我在这里使用分离实体,因为我通过 API 接收整个模型。
// This is the result of Deal entity deserialization
var deal = new Deal
{
Id = "D1",
Buyer = new Person
{
Id = "P1",
Name = "Person1",
City = new City { Name = "City1" }
},
Seller = new Person
{
Id = "P2",
Name = "Person2",
City = new City { Name = "City1" }
}
};
_dbContext.Deals.Add(deal);
_dbContext.SaveChanges();
错误是
System.InvalidOperationException:“无法跟踪实体类型“City”的实例,因为已经在跟踪具有相同键值 {'Name'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。'
以下是实体的设置方式:
modelBuilder.Entity<City>(x =>
{
x.HasKey(e => e.Name);
});
modelBuilder.Entity<Person>(x =>
{
x.HasKey(e => e.Id);
x.Property(e => e.Name);
x.HasOne(e => e.City).WithMany();
});
modelBuilder.Entity<Deal>(x =>
{
x.HasKey(e => e.Id);
x.HasOne(e => e.Buyer).WithMany();
x.HasOne(e => e.Seller).WithMany();
});
处理此类实体的正确方法是什么? 我使用 EF Core 6
【问题讨论】:
-
数据库中的任何键都必须是唯一的。使用多个人来自同一城市的城市是错误的。对于密钥,请使用唯一的 ID。
标签: c# entity-framework entity-framework-core