代码优先实体框架 - 多对多关系

时间:2017-12-17 05:32:58

标签: c# entity-framework

我有以下

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表上查找该条目是否已创建?

1 个答案:

答案 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();
    }