【问题标题】:Create Navigation Property in Entity Framework Without all keys/foreign keys在没有所有键/外键的实体框架中创建导航属性
【发布时间】:2014-04-29 14:26:09
【问题描述】:

我一直试图弄清楚是否可以在不使用所有键的情况下在 EF 中创建关联。

以下是作者中有组合键的示例,但我在书中只有该键的 1 部分。我的问题是如何在没有所有键的情况下创建导航属性?

[Table("Book")]
public class Book {

    [Key]
    public int ID { get; set; }

    public string AuthorLastName { get; set; }

    public virtual Author Author { get; set; }
}

[Table("Author")]
public class Author {

    [Key, Column(Order=0)]
    public string AuthorFirstName { get; set; }

    [Key, Column(Order=1)]
    public string AuthorLastName { get; set; }

    public virtual ICollection<Book> Books { get; set; }
}

internal class BookConfig : EntityTypeConfiguration<Book> {
    public BookConfig()
    {
        HasRequired(hr => hr.Author)
            .WithMany(wm => wm.Books)
            .HasForeignKey(fk => new { 
                fk.AuthorLastName
            });
    }
}

这显然行不通,因为我没有书中的所有完整组合键以这种方式将其与作者相关联。

【问题讨论】:

    标签: c# entity-framework orm navigation-properties


    【解决方案1】:

    你可以这样做:

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }
    

    这将使您可以手动控制按键;但是数据库中的Table必须有主键!我想知道为什么你需要这样的东西,我认为问题在其他地方。

    【讨论】:

    • 我正在使用 Dynamics Nav 表结构,这让我无法选择修改哪些表中的哪些键,即使它们具有与上述类似的直接关系。我不写任何记录,我只从这个数据库中读取。它不完全是代码优先,因为我手动映射到已经创建的数据库,并且我想创建将充当导航属性的内容,而无需集合表中的完整复合键。不幸的是,上述解决方案并不能解决我的问题。
    • 那为什么不先使用数据库呢?
    • @reggaeguitar 我不确定他是否先使用数据库,我不确定他是否可以创建部分实体,如果他能做到,我认为这不是一份好工作。跨度>
    • 是的,我同意@JotaBe;因此,您可以更改您的关系 1..n,而不是使用带有/不带有延迟加载的急切加载。
    • 由于表结构,我不能先使用数据库。例如表 company1$item 和 company2$item。对于我的应用程序,我告诉它要运行哪家公司,然后从中构建 DataModel。在 buildModel 期间需要 companyName + "$" + tableName("item") 来构建表映射。这使我可以将应用程序集中在每个实例的 1 家公司上。 Book and Author 只是一个更复杂问题的基本示例。有什么方法可以模拟 Navigation 属性以按照我想要的方式行事。在我的情况下,通过父母复合键的 1 个字段获取列表是可行的。
    【解决方案2】:

    你不能这样做,因为它是多对多的关系。

    在您的示例中,如果您只选择AuthorLastName,则可能有多个姓氏相同的作者。所以关系的这一边有很多元素。显然,另一边有很多书(一个作者可以写很多书)。

    因此,当然,您不能将其建模为一对多关系。

    幸运的是,someone has explained this problem of books and authors before.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多