实体框架关系匹配 - DB中没有外键

时间:2014-07-29 20:37:27

标签: c# sql-server entity-framework code-first

我已经完成了实体框架代码优先教程,但我不愿意说,但我对它的工作方式感到茫然。一切正常,但我想知道如何,因为我所知道的基本数据库设计的一切都告诉我它不应该。我觉得我错过了创建外键的关键链接,并希望有人能解释一下。

我最初复制并粘贴了一堆具有多个子类型的简单父类的代码优先设计。在我的子类型中,我引用了虚拟Parent和ParentID引用。我在数据库中注意到,对于A和B类型的每个孩子,ParentID的值都是0。

但是,在代码和调试/显示中加载数据时,实体关系得到了正确维护。

代码看起来像(类名被更改为删除它的上下文):

public class Parent{
    public int? ParentID {get;set;}
    public virtual ChildA ChildA {get;set;}
    public virtual ChildB ChildB {get;set;}
}

public class ChildA{
    [Key,ForeignKey(Parent)]
    public int ChildAID {get;set;}

    public string Field {get;set;}

    //public int ParentID {get;set;}

    [ForeignKey("ParentID")]
    public virtual Parent Parent {get;set;}
}

public class ChildB{
    [Key,ForeignKey(Parent)]
    public int ChildBID {get;set;}

    public string Field {get;set;}

    //public int ParentID {get;set;}

    [ForeignKey("ParentID")]
    public virtual Parent Parent {get;set;}
}

我评论了ParentID以明确显示我在说什么。为了测试这一点,我删除了数据库中的列,但关系仍然正常。在数据库中只有三个与此相关的表(Parent,ChildA和ChildB)。没有任何外键,父表不引用子表,子表不引用父表。当我从DBContext加载它们时,映射会在我保存时正确加载它们。

我在这里缺少什么?某个地方正在跟踪这个映射,但我无法分辨到哪里。事实上,它并没有作为一个真正基本的外键存储在数据库中,这让我对性能产生了担忧。

2 个答案:

答案 0 :(得分:0)

There aren't any foreign keys, and the parent table doesn't reference the children tables and the children tables don't reference the parent table.是什么意思?

我认为您错过了注意它们之间存在关系。

Tables

它被称为one to zero-or-one关系。

答案 1 :(得分:0)

你的问题有点令人困惑,因为实体框架确实将关系存储为"非常基本的外键",所以我无法看到你是如何得出这个结论的。

注释掉ParentID以显示你所说的内容并没有多大帮助,因为它实际上应该没有任何效果。这是因为当您将[ForeignKey(" ParentID")]属性添加到Parent属性时,您告诉Entity Framework将外键放在名为" ParentID"的数据库中。模拟父关系。

您在实体中不需要ParentID整数属性,但通常更容易包含外键,大多数示例都显示了这一点。

现在,如果您确实包含ParentID,那么您不需要Parent属性上的[ForeignKey(" ParentID")]属性,因为EF将假定ParentID是外键的外键。父导航属性,因为您遵循了标准命名约定。

你也可以尝试这个 - 删除ParentID和[ForeignKey(" ParentID"]属性并更新数据库。现在你应该发现EF已经添加了一个名为&#34的外键; Parent_Id& #34;所以永远使用外键!

键上的[Key,ForeignKey(Parent)]属性看起来不对。该ID不是导航属性,因此您不需要为其指定外键,因此我不确定它在做什么(实际上,再想一想,这可能是您的问题,我认为这是一对一的指定。该Key属性也是不必要的,因为您再次遵循命名约定。

总而言之,获取所有属性的镜头并遵循命名约定,直到你需要做一些棘手的事情!

相关问题