我有以下
class Human
int id
string gender
List<PhysicalAttribute> attributes
class PhysicalAttributes
int id
string description
string type
List<Human> humans
当我添加第一个带有属性的人时,会创建表并正确填充数据。
问题是当我添加具有相似属性的下一个人时。我们说我有属性
type:"body"
description:"slim"
对于第一人和第二人。当我创建新的并添加第二个人时,另一个具有相同类型和描述的条目将添加到PhysicalAttributes
表中。
有没有办法这样做才能使用现有的条目?
我是否必须首先在PhysicalAttributes
表上查找该条目是否已创建?
答案 0 :(得分:0)
有没有办法这样做才能使用现有的条目?
是。 Make(类型,描述)PhysicalAttributes的实体密钥。您似乎已经引入了一个无意义的ID键属性,它允许多个PhysicalAttributes具有相同的类型和描述。
也可能无法修复模型,并从数据库中获取现有的PhysicalAttributes以发现是否已存在任何需要的物理属性。但这对于拥有错误的实体密钥结构来说只是一个繁琐的解决方法。
如果您从JSON加载它会使附加现有实体变得不方便,而是可以执行以下操作。
覆盖SaveChanges并从数据库中获取所有PhyscialAttribute值。然后,对于已存在于数据库中的PhysicalAttribute实体,将它们与DbContext分离,并且EF不会尝试插入它们。
在调用PhysicalAttributes.Load()之后,对于数据库中已存在的新实体上的每个PhysicalAttribute,ChangeTracker中将有两个条目。
EG
public override int SaveChanges()
{
PhysicalAttributes.Load();
var entryGroup = from entry in ChangeTracker.Entries<PhysicalAttribute>()
group entry by new { entry.Entity.Description, entry.Entity.Type } into byKey
where byKey.Any( e => e.State == EntityState.Unchanged)
select byKey;
foreach (var eg in entryGroup)
{
foreach (var e in eg )
{
if (e.State == EntityState.Added)
{
e.State = EntityState.Detached;
}
}
}
return base.SaveChanges();
}