实体框架6中没有参照完整性约束的导航属性

时间:2015-04-24 22:01:04

标签: c# entity-framework entity-framework-6

在EF 6(代码优先)中,是否可以设置导航属性而不强制执行参照完整性约束?

例如:

public class Person{

    public IList<Pet> Pets { get; set; }

}

public class Pet{

    public int OwnerId { get; set; }
    public Person Owner { get; set; }

}

因此,在上面的示例中,我希望能够使用OwnerId添加Pet,即使Owers表中不存在该所有者。

由于

马特

2 个答案:

答案 0 :(得分:2)

您可以使用流畅的API定义关系。

modelBuilder.Entity<Pet>
    .hasOptional(p => p.Owner)
    .willCascadeOnDelete(false);

这会将关系属性配置为可选,并确保级联删除不会生效。您可以在没有Pet的情况下创建Owner,删除Owner也不会删除关联的Pets

然而,您无法将Pet.OwnerId分配给OwnerId表格中不存在的Owner。如果您真的需要某种方法来跟踪无效的OwnerId值,您需要有一个单独的属性,您可以使用任意值手动更新,或者您需要在不使用导航属性的情况下定义这些对象,并且手动执行查找。

这将是一种特殊情况,您需要为OwnerId提供与Owner表不匹配的任意值;在99%的案例中,只接受有效OwnerIdnull的可选关系。

OwnerId对象上实际上不需要Pet属性,但如果它存在,则应设置为int?可以为空。

答案 1 :(得分:0)

简答:不要使用EF。 Object Relational Mappers的重点是确保您拥有有效数据以及帮助检索/保存它

你真正想要的只是某种映射器。

长答案:好奇自己