【问题标题】:EF - Attribute ForeignKeyEF - 属性外键
【发布时间】:2015-06-03 15:52:10
【问题描述】:

我想要一个公司的联系人列表。但是 Company 被 ContactExtension 引用,而 ContactExtension 被 Contact 引用。 我不确定这是否可能,但我试试这个:

[Table("Company", Schema = "dbo")] 
public class Company
{
    [Column("ID")]
    [Key]
    public int ID { get; set; }
    [Column("Name")]
    public String Name { get; set; }
    [ForeignKey(?)]
    public virtual ICollection<Contact> MyContacts { get; set; }
}

[Table("Contact", Schema = "dbo")]
public class Contact
{
    [Column("ID")]
    [Key]
    public int ID { get; set; }
    [Column("Name")]
    public String Name { get; set; }
    [Column("ContactExtensionID")]
    public int ContactExtensionID { get; set; }
    [ForeignKey("ContactExtensionID")]
    public virtual ContactExtension ContactExtension { get; set; }
}

[Table("ContactExtension", Schema = "dbo")]
public class ContactExtension
{
    [Column("ID")]
    [Key]
    public int ID { get; set; }
    [Column("Name")]
    public String Name { get; set; }
    [Column("CompanyID")]
    public int CompanyID { get; set; }
}

如果我写ForeignKey["CompanyID"],则有问题,因为Contact 中没有CompanyID 列。

如何指定外键 CompanyID 在 ContactExtension 中?

我想找到一个没有Fluent Api 的解决方案。

【问题讨论】:

  • 你在使用Fluent API吗?
  • 不,我想找到没有 Fluent Api 的解决方案
  • 你见过this吗?
  • 是但外键不在Contact中,它在ContactExtension中
  • 来自ContactExtensionContactvirtual 属性在哪里?

标签: c# .net entity-framework attributes


【解决方案1】:

忘记 Companies 和 ContactExtensions 表之间的直接关系 1 到 N。该连接通过联系人表存在。

然后,如果您想从 Company 实例中引用 ContactExtensions,您可以这样做:

var tenthContact = company.Contacts.ElementAt(10);
var contactExtension = tenthContact.ContactExtension;

如果你想做:

var companyContactExtensions = company.ContactExtensions;

您可以只创建一个 ContactExtensions 属性,该属性会为您计算而不映射到数据库。在您的 Company 类中:

public ICollection<CompanyExtension> CompanyExtensions
{
      get
      {
          return this.CompanyContacts.SelectMany(c => c.ContactExtension).ToList();
      }
}

更新

请阅读您的最后一条评论:I want to do this : ContactExtension.CompanyID

解决方法是一样的。由于您在中间有一个联系人实体/表,因此 直接 连接不存在。

如果你真的想要那个属性,你可以使用 Contact 和 ContactExtension 之间的一对一关系,然后引用公司:

companyExtension.Contact.Company.CompanyID

为此,您将创建一个属性Contact 链接到ContactExtension 类中的Contact 类,并创建另一个属性Company 链接到Contact 类中的Company 类。

为了直接执行此操作,您创建另一个未映射到为您计算该数据库的属性:

public int CompanyID
{
  get
  {
    return this.Contact.Company.CompanyID;
  }
}

PS:我认为您认为您创建了从 Company 到 Contact 以及从 Contact 到 ContactExtensions 的连接,但它并不是真正的“从...到”。这些连接是“之间”的,因此,您可以在相反的方向进行链接。

Entity Framework 理解您的意思,并且数据库结构将保持不变。


或者,如果您在 Contacts 和 ContactExtensions 之间建立了 1 对 1 的连接,您可以将所有内容都放在同一个表中。

【讨论】:

  • 没问题,@Jonas,将其标记为答案也会对其他人有所帮助。干杯
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 2016-01-31
  • 2013-10-21
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多