如何在EF 7 alpha中添加外鍵

entity-framework-core

如何在EF 7 alpha3中建立一對一的關係?

僅定義導航屬性的舊方法不起作用,並且modelBuilder沒有以前使用的HasRequired / HasOptional方法。

任何人都可以對此有所了解嗎?

一般承認的答案

直到最近,還沒有任何用於定義關係的模型構建器API。相反,您必須操縱底層的modelBuilder.Model對象。以下是一對多關係的示例。

class Blog
{
    public Blog()
    {
        Posts = new List<Post>();
    }

    public int Id { get; set; }

    public ICollection<Post> Posts { get; set; }
}

class Post
{
    public int Id { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

class BlogContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Post>().ForeignKeys(x => x.ForeignKey<Blog>(p => p.BlogId));

        var model = builder.Model;
        var blog = model.GetEntityType(typeof(Blog));
        var post = model.GetEntityType(typeof(Post));
        var fk = post.ForeignKeys.Single(k => k.ReferencedEntityType == blog);
        blog.AddNavigation(new Navigation(fk, "Posts", pointsToPrincipal: false));
        post.AddNavigation(new Navigation(fk, "Blog", pointsToPrincipal: true));
    }
}

您可以閱讀有關我們當前(截至2014-07-31)思考這些API的內容的更多信息。最終結果如下所示。

class Blog
{
    public Blog()
    {
        Posts = new List<Post>();
    }

    public int Id { get; set; }

    public ICollection<Post> Posts { get; set; }
}

class Post
{
    public int Id { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

class BlogContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Post>().ForeignKeys(x => x.ForeignKey<Blog>(p => p.BlogId));

        var model = builder.Model;
        var blog = model.GetEntityType(typeof(Blog));
        var post = model.GetEntityType(typeof(Post));
        var fk = post.ForeignKeys.Single(k => k.ReferencedEntityType == blog);
        blog.AddNavigation(new Navigation(fk, "Posts", pointsToPrincipal: false));
        post.AddNavigation(new Navigation(fk, "Blog", pointsToPrincipal: true));
    }
}

熱門答案

使用EF7 beta7,引入了一組新的方法來定義實體之間的關係。

對於一對多的關係,

modelBuilder.Entity<Post>()
   .Reference(typeof(Blog), "Blog")
   .InverseCollection("Posts")
   .ForeignKey(new string[] { "BlogId" });

使用, .Reference(typeof(Blog), "Blog")從實體PostBlog關係已配置。第一個論點是Post目標的實體類型,第二個論點是導航屬性的名稱。

使用.InverseCollection("Posts") ,配置一對多關係。這個函數的參數是導航集合的名稱。

使用.ForeignKey(new string[] { "BlogId" }) ,配置外鍵。如果未設置此外鍵,則會自動為您生成影子外鍵。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因