在实体框架中创建导航属性,不使用所有键/外键

时间:2014-04-29 14:26:09

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

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

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

[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
            });
    }
}

这显然无法奏效,因为我没有书中的所有完整组合键以这种方式将其与作者联系起来。

2 个答案:

答案 0 :(得分:0)

你可以这样做:

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

这将为您提供手动控制键;但是数据库中的表必须有一个主键!我很想知道为什么你需要这样的东西我认为其他地方的问题。

答案 1 :(得分:0)

你不能这样做,因为它有很多关系。

在您的示例中,如果您只使用AuthorLastName,则可能会有多个具有相同姓氏的作者。因此关系的这一方面有许多要素。显然,另一方面有很多书(作者可以写很多书)。

所以,当然,你无法将其建模为一对多的关系。

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