如何在 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" );
配置了从实体Post
到Blog
的.Reference(typeof(Blog), "Blog")
关系。第一个参数是 Post 所针对的实体的类型,第二个参数是导航属性的名称。
使用.InverseCollection("Posts")
,配置了一对多关系。此函数的参数是导航集合的名称。
使用.ForeignKey(new string[] "BlogId" )
,配置了外键。如果未设置此外键,则会自动为您生成影子外键。
【讨论】:
以上是关于如何在 EF 7 alpha 中添加外键的主要内容,如果未能解决你的问题,请参考以下文章