EF41中的导航属性,代码优先,没有外键?

时间:2011-10-22 10:30:34

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

是否可以先使用代码在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的导航属性......)

1 个答案:

答案 0 :(得分:0)

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

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

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