Entity framework core 实体框架核心一对一关系在SQL Server中生成一对多

Entity framework core 实体框架核心一对一关系在SQL Server中生成一对多,entity-framework-core,Entity Framework Core,基于本教程,对于实体框架核心(rc1或rc2)中的一对一关系,我使用以下代码: public class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<BlogImage> BlogImages { get; set; } protected override void OnModelCreating(ModelBuilder modelBu

基于本教程,对于实体框架核心(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; }
}
公共类MyContext:DbContext
{
公共数据库集博客{get;set;}
公共数据库集BlogImages{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasOne(p=>p.BlogImage)
.WithOne(i=>i.Blog)
.HasForeignKey(b=>b.BlogForeignKey);
}
}
公共类博客
{
public int BlogId{get;set;}
公共字符串Url{get;set;}
公共BlogImage BlogImage{get;set;}
}
公共类博客镜像
{
public int BlogImageId{get;set;}
公共字节[]映像{get;set;}
公共字符串标题{get;set;}
public int BlogForeignKey{get;set;}
公共博客Blog{get;set;}
}
但在运行迁移并检查数据库后,我注意到生成的表具有以下关系:


什么是解决方案?

BlogImageId
应该是
BlogImage
的主键和
Blog
的外键:

公共类BlogImage
{
public int BlogImageId{get;set;}
公共字节[]映像{get;set;}
公共字符串标题{get;set;}
//已删除BlogForeignKey
公共博客Blog{get;set;}
}
modelBuilder.Entity()
.HasOne(p=>p.BlogImage)
.WithOne(i=>i.Blog)
.HasForeignKey(b=>b.BlogImageId);//BlogImageId是FK

您的代码看起来不错,实际上您正在
Blog
BlogImage
对象之间创建1:1的关系,EF Core通过允许您在这两个对象之间建立双向关联来识别这一点

唯一的问题是EF Core未能通过在
BlogForeignKey
列上创建唯一约束将此一对一关联转换为数据库,因此,您的对象模型中存在一对一关联,该关联映射到数据库中的一对多关系

这是一个 这将在最终版本中修复


现在,如果你想创建一个,那么@Gert提供的答案是可行的,但是如果你想在一个唯一的外键(即BlogForeignKey)或基本上是a上创建一对一的关联,那么不要更改你的代码,只需手动在BlogForeignKey列上创建一个唯一的约束,然后等待RTM版本在本月底发布

问题是什么?我以前测试过这段代码,这段代码在migrationWell中抛出异常。如果您想要1:1关联,这就是您需要的。如果您在问题中提到自己的努力和迁移问题,If会有所帮助。此外,抛出异常也不是很有用。例外情况是什么?您的代码是正常的,我像这样测试代码,区别在于BlogImage实体中的BlogImageId是BlogId。出现异常。System.InvalidOperationException:实体类型“WebApplication18.Data.BlogImage”需要定义密钥。在Microsoft.EntityFrameworkCore.Internal.ModelValidator.淋浴Ror(字符串消息)中,不管怎样,您的代码都是正确的。