EF41中的导航属性首先使用代码,没有外键
本文关键字:代码 导航 属性 EF41 | 更新日期: 2023-09-27 18:11:57
是否可以在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被更改了几次,因此在Person中有一个条目,而在PersonHist中有N个历史条目。现在我删除Person,所以Person不应该有这个Person, PersonHist现在多了一个条目。但这是不可能的外键…(我不想亲自删除Flag/Column !),但是我想要一个从Person到PersonHist的导航属性…)
导航属性背后的逻辑基于外键。如果你想映射它并使用它作为导航属性你必须在PersonHist
中有外键。您可以使键为空,但您必须正确使用它:
- 修改映射,删除默认使用的级联删除
- 在删除
Person
之前将所有相关的PersonHist
设置为null或实现自定义数据库初始化器并将引用约束替换为ON DELETE SET NULL
如果你不想要外键,不要使用它作为导航属性,并使用单独的查询来获取person的历史记录-但它仍然需要一些列指向原始Person
记录