如何在 EF 7 alpha 中添加外键

Posted

技术标签:

【中文标题】如何在 EF 7 alpha 中添加外键【英文标题】:how to add foreign keys in EF 7 alpha 【发布时间】:2014-11-01 20:05:42 【问题描述】:

如何在 EF 7 alpha3 中建立一对一关系?

只定义导航属性的旧方式行不通,modelBuilder没有之前使用的HasRequired/HasOptional方法。

谁能解释一下?

【问题讨论】:

【参考方案1】:

直到最近,还没有任何用于定义关系的模型构建器 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 年 7 月 31 日)对what these APIs will look like 的想法。最终结果将如下所示。

modelBuilder.Entity<Blog>()
    .OneToMany(b => b.Posts, p => p.Blog).ForeignKey(b => b.BlogId);

【讨论】:

我使用的是 EF7 beta3,而 Entity 没有 ForeignKeys 属性。 OneToMany、ManyToOne、One 和 Manya 仍然缺失。目前在 EF7 中还有其他可能存在一对多/多对一关系的可能性吗? 我使用 Entity().HasMany().WithOne().ForeignKey() -syntax 取得了一些成功。即使引用的父模型(“Blog”)仍然为空,至少自定义外键(不是“BlogId”,而是“SomethingOtherId”)有点工作。以前我得到“列“BlogId”未找到错误”。 一切都过去了。 EF7 beta7。 @Shimmy 你知道我在哪里可以找到 EF7 beta7 中的这些方法吗?我找不到它。【参考方案2】:

在 EF7 beta7 中,引入了一组新的方法来定义实体之间的关系。

对于一对多关系,

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

配置了从实体PostBlog.Reference(typeof(Blog), "Blog") 关系。第一个参数是 Post 所针对的实体的类型,第二个参数是导航属性的名称。

使用.InverseCollection("Posts"),配置了一对多关系。此函数的参数是导航集合的名称。

使用.ForeignKey(new string[] "BlogId" ),配置了外键。如果未设置此外键,则会自动为您生成影子外键。

【讨论】:

以上是关于如何在 EF 7 alpha 中添加外键的主要内容,如果未能解决你的问题,请参考以下文章

EF 7 alpha 3:Azure 表存储

添加外键时首先在EF核心代码中生成双id字段

ef core 如何一次从具有外键的不同表中获取数据? (数据库优先)

在 EF 4 上映射外键而不创建新的 Edmx 文件

EF 4.1 Code First 添加到外键集合

如何使用 EF Code First Fluient API 从主表配置多个外键引用到同一个表