对于基于本教程http://ef.readthedocs.io/en/latest/modeling/relationships.html#one-to-one的Entity Framework核心(rc1或rc2)中的一对一关系,我使用此代码:
public class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<BlogImage> BlogImages { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasOne(p => p.BlogImage)
.WithOne(i => i.Blog)
.HasForeignKey<BlogImage>(b => b.BlogForeignKey);
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public BlogImage BlogImage { get; set; }
}
public class BlogImage
{
public int BlogImageId { get; set; }
public byte[] Image { get; set; }
public string Caption { get; set; }
public int BlogForeignKey { get; set; }
public Blog Blog { get; set; }
}
但是在运行迁移并检查数据库之后,我注意到生成的表具有以下关系:
什么是解决方案?
答案 0 :(得分:2)
您的代码看起来很好,并且您实际上在Blog
和BlogImage
对象之间创建了1:1的关系,而EF Core通过允许您在这两个对象之间进行双向关联来识别这一点。
唯一的问题是EF Core 失败通过在BlogForeignKey
列上创建一个唯一约束来将这一个转换为一个与数据库的关联,因此您有一对一对象模型中的关联,映射到数据库中的一对多关系。
这是Bug in EF Core 这将在最终版本中修复。
现在,如果您想创建一个 Shared Primary Key Association ,那么@Gert提供的答案是可行的方法,但如果您打算在独特的外国人上创建一对一的关联密钥(即BlogForeignKey)或基本上One-to-One Foreign Key Association然后不更改您的代码,只需在BlogForeignKey列上手动创建一个唯一约束,并等待scheduled的RTM版本由本月底。
答案 1 :(得分:1)
BlogImageId
应该是BlogImage
的主键和 Blog
的外键:
public class BlogImage
{
public int BlogImageId { get; set; }
public byte[] Image { get; set; }
public string Caption { get; set; }
// Removed BlogForeignKey
public Blog Blog { get; set; }
}
modelBuilder.Entity<Blog>()
.HasOne(p => p.BlogImage)
.WithOne(i => i.Blog)
.HasForeignKey<BlogImage>(b => b.BlogImageId); // BlogImageId is FK