Entity framework core 实体框架核心一对一关系在SQL Server中生成一对多
基于本教程,对于实体框架核心(rc1或rc2)中的一对一关系,我使用以下代码: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
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(字符串消息)中,不管怎样,您的代码都是正确的。