如何在 EF 7 alpha3 中建立一对一的关系?
只定义导航属性的旧方式行不通,modelBuilder没有之前使用的HasRequired/HasOptional方法。
任何人都可以对此有所了解吗?
如何在 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 年 7 月 31 日)对这些 API 外观的思考。最终结果将如下所示。
modelBuilder.Entity<Blog>()
.OneToMany(b => b.Posts, p => p.Blog).ForeignKey(b => b.BlogId);
在 EF7 beta7 中,引入了一组新的方法来定义实体之间的关系。
对于一对多的关系,
modelBuilder.Entity<Post>()
.Reference(typeof(Blog), "Blog")
.InverseCollection("Posts")
.ForeignKey(new string[] { "BlogId" });
使用,配置.Reference(typeof(Blog), "Blog")
从实体Post
到Blog
的关系。第一个参数是 Post 所针对的实体的类型,第二个参数是导航属性的名称。
使用, .InverseCollection("Posts")
, 配置一对多关系。此函数的参数是导航集合的名称。
使用, .ForeignKey(new string[] { "BlogId" })
, 配置了外键。如果未设置此外键,则会自动为您生成影子外键。