【问题标题】:Navigation properties in EF41 with code first, without having a foreign key?EF41 中的导航属性,代码优先,没有外键?
【发布时间】:2011-10-22 10:30:33
【问题描述】:

是否可以先使用代码在 EF41 中创建/映射导航属性,而无需外键? 就我而言,我需要它来进行历史记录:

public class Person
{
 public virtual Guid ID { get; set; }
 public virtual string Name { get; set; }
 public virtual IList<PersonHist> History { get; set; }
}

public class PersonHist
{
 public virtual Guid ID { get; set; }
 public virtual Guid PersonID { get; set; }
 public virtual string Name { get; set; }
}

想象一下:一个人被改变了好几次,所以在 Person 中有一个条目,而在 PersonH​​ist 中有 N 个历史条目。现在我删除了 Person,所以 Person 不应该有这个 Person 并且 PersonH​​ist 现在多了一个条目。但这对于外键是不可能的...... (我不想在 Person 中删除 Flag/Column!,但我想要从 Person 到 PersonH​​ist 的导航属性...)

【问题讨论】:

    标签: c# entity-framework ef-code-first


    【解决方案1】:

    导航属性背后的逻辑基于外键。因此,如果您想映射它并将其用作导航属性,您必须在PersonHist 中有外键。您可以使密钥为空,但您必须正确使用它:

    • 修改映射以移除默认使用的级联删除
    • 在删除 Person 之前将所有相关的 PersonHist 设置为 null 或实现自定义数据库初始化程序并将引用约束替换为 ON DELETE SET NULL

    如果您不想要外键,请不要将其用作导航属性并使用单独的查询来获取人员的历史记录 - 但它仍然需要一些指向原始 Person 记录的列。

    【讨论】:

      猜你喜欢
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多