【问题标题】:EntityFramework Mutli-Table Many-to-Many实体框架多表多对多
【发布时间】:2012-05-28 06:16:30
【问题描述】:

我正在使用 EF4.1 Code First 并尝试创建一些需要链接表的多对多关系表。请看下面代码的小sn-p:

class Event
{
    int EventId { get; set; }
    ICollection<Contact> Contacts { get; set; }
}

class Contact
{
    int ContactId { get; set; }
    ICollection<Relation> Relations { get; set; }
}

class Relation
{
    int RelationId { get; set; }
    string Name { get; set; }
}   

所以Contacts对象可以有很多不同类型的Relationship,例如“Mother”、“Father”、“Brother”等。

我需要跟踪某个联系人参加的某种活动,但我想知道他与举办该活动的人的关系。例如,他是事件者的兄弟、父亲还是丈夫?在另一个活动中,同一个人可能会出现,但会是活动者的姐夫。

联系事件是多对多的;与联系人的关系是一对多的。

在 SQL 中,我们只需要创建一个链接表,并在其中包含所有三个属性 ID(EventId、ContactId、RelationId);但是,在 Code First 中,您将如何表示这种关系?

【问题讨论】:

    标签: c# entity-framework many-to-many code-first multi-table


    【解决方案1】:

    与数据库相同,您必须创建一个映射实体,就像在数据库中的映射表一样的 ContactEvents。

    class Event
    {
      int EventId { get; set; }
      ICollection<ContactEvent> ContactEvents { get; set; }
    }
    
    class ContactEvent
    {
      int EventId {get;set;}
      int ContactId {get;set;}
      public virtual Event Event {get; set;}
      public virtual Contact Contact {get;set;}
    }
    
    class Contact
    {
       int ContactId { get; set; }
       ICollection<ContactEvent> ContactEvents { get; set; }
       ICollection<Relation> Relations { get; set; }
    }
    
    class Relation
    {
      int RelationId { get; set; }
      string Name { get; set; }
      public virtual Contact Contact {get; set}
    }   
    

    【讨论】:

    • hmm...虽然这是我的第一个想法,但在 Code First 中,您可以在不创建映射对象的情况下建立多对多关系,所以我想看看我是否无需创建全新对象即可完成相同的操作。
    • 我不知道你为什么要避免创建一个全新的对象?有什么原因吗?
    • 另外,这并不能完全回答问题,因为在您的代码中,您指出了如何将联系人链接到事件,但我需要链接联系人、事件和关系。可以使用约定配置多对多关系。我本质上是在寻找多对多的关系。
    • 我不介意创建另一个对象,但如果有更好的方法,为什么不这样做呢?
    • 要跟踪实体,您需要虚拟属性,添加虚拟属性,然后您可以跟踪联系人、事件和关系,我认为您需要为数据库中的每个表创建一个实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多