![](/img/trans.png)
[英]Entity Framework 6 multiple table to one foreign key relationship code first
[英]Entity Framework Table Splitting: not in the same type hierarchy / do not have a valid one to one foreign key relationship
我正在使用 Entity Framework 6 和 Code-First 方法,我希望将两个实体放在同一个表中。 我究竟做错了什么?
[Table("Review")]
public class Review
{
public int Id { get; set; }
public PictureInfo PictureInfo { get; set; }
public int PictureInfoId { get; set; }
}
[Table("Review")]
public class PictureInfo
{
[Key, ForeignKey("Review")]
public int ReviewId { get; set; }
public Review Review { get; set; }
}
我得到的错误:实体类型“PictureInfo”和“Review”无法共享表“Review”,因为它们不在同一类型层次结构中,或者它们之间没有有效的一对一外键关系以及匹配的主键。
我究竟做错了什么?
我已经成功地用流畅的api实现了你想要的东西。 Fluent api提供了比数据注释更丰富的配置选项。 我改变了你的实体类:
public class Review
{
public int Id { get; set; }
public PictureInfo PictureInfo { get; set; }
}
不需要PictureInfoId属性,因为将在两个实体的主键上完成外键关系。
public class PictureInfo
{
public int Id { get; set; }
public Review Review { get; set; }
}
由于Review和PictureInfo将映射到同一个表,因此需要共享相同的主键列,因此对于PictureInfo和Review,此列应具有相同的名称。 如果您想保留名为ReviewId的PictureInfo主键属性,则可以执行此操作,但您需要将其名称映射到“Id”。 最后的DbContext:
public class MyDbContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Review>().HasKey( e => e.Id );
modelBuilder.Entity<Review>()
.HasRequired(e => e.PictureInfo)
.WithRequiredDependent(e => e.Review);
modelBuilder.Entity<Review>().Map(m => m.ToTable("Review"));
modelBuilder.Entity<PictureInfo>().Map(m => m.ToTable("Review"));
modelBuilder.Entity<PictureInfo>().HasKey(e => e.Id);
base.OnModelCreating(modelBuilder);
}
public DbSet<Review> Reviews { get; set; }
public DbSet<PictureInfo> PictureInfos { get; set; }
}
OnModelCreating包含流畅的api映射定义。 您所要做的就是在两个具有相同名称的实体上定义主键,将这两个实体绑定为1-1关系,然后将它们映射到同一个表。
似乎问题是这种关系被解释为一对一,而不是一对一。
Review端上的外键int PictureInfoId
不需要/被忽略,因此它的不可为空性不会使查询结束所需的关系。 删除此不需要的密钥并将[Required]属性添加到PictureInfo导航属性解决了它。
这是更正后的评论课。
[Table("Review")]
public class Review
{
public int Id { get; set; }
[Required]
public PictureInfo PictureInfo { get; set; }
}
解决此问题的另一种方法是创建仅包含所需字段的视图。 然后将实体映射到视图。
(这些测试和错误是针对EF 6.1.3编写的)
[Table("Review")]
public class Review
{
[Key]
public int Id { get; set; }
public PictureInfo PictureInfo { get; set; }
}
[Table("Review")]
public class PictureInfo
{
[Key]
public int Id { get; set; }
public Review Review { get; set; }
}
有了上述实体,我收到了这个错误:
无法确定类型之间关联的主要结束。 必须使用关系流畅API或数据注释显式配置此关联的主要结尾。
[Table("Review")]
public class Review
{
[Key]
public int Id { get; set; }
[Required]
public PictureInfo PictureInfo { get; set; }
}
[Table("Review")]
public class PictureInfo
{
[Key]
public int Id { get; set; }
[Required]
public Review Review { get; set; }
}
实体类型'Review'和'PictureInfo'不能共享表'Review',因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系,它们之间具有匹配的主键。
[Table("Review")]
public class Review
{
[Key]
public int Id { get; set; }
[Required, ForeignKey("Id")]
public PictureInfo PictureInfo { get; set; }
}
[Table("Review")]
public class PictureInfo
{
[Key]
public int Id { get; set; }
[Required, ForeignKey("Id")]
public Review Review { get; set; }
}
无法确定类型之间关联的主要结束。 必须使用关系流畅API或数据注释显式配置此关联的主要结尾。
[Table("Review")]
public class Review
{
[Key, ForeignKey("PictureInfo")]
public int Id { get; set; }
public PictureInfo PictureInfo { get; set; }
}
[Table("Review")]
public class PictureInfo
{
[Key, ForeignKey("Review")]
public int Id { get; set; }
public Review Review { get; set; }
}
using System.Linq;
using System.Data.Entity;
namespace Sample
{
class Program
{
static void Main(string[] args)
{
using (var context = new EmployeeDBContext())
{
var result = context.Set<Employee>().Include(x => x.Department).ToArray();
}
}
}
public class EmployeeDBContext : DbContext
{
public EmployeeDBContext() : base("EmployeeDB") { }
public DbSet<Employee> Employee { get; set; }
public DbSet<Department> Department { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Department>().ToTable("Departments").HasKey(x => x.DepartmentId);
modelBuilder.Entity<Employee>().ToTable("Employees").HasKey(x => x.Id);
//ForeignKey mapping
modelBuilder.Entity<Employee>().HasRequired(x => x.Department).WithMany().HasForeignKey(x => x.DepartmentId);
base.OnModelCreating(modelBuilder);
}
}
//Domain Entity
public class Employee
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Department Department { get; set; }
public int DepartmentId { get; set; }
}
//Domain Entity
public class Department
{
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
}
}
我想在这里为遇到此错误的人添加注释,但并不意味着让两个实体都指向同一个表......
确保您没有在“表格”属性中不小心放置了不正确的表格名称。
导致该错误的原因是表的定义在表“PictureInfo”的指令中重复。 您只需要编辑该指令。
[表(“评论”)]公共课回顾{...}
[表(“评论”)]公共类PictureInfo {...}
对于
[表(“评论”)]公共课回顾{...}
[表(“ PictureInfo ”)]公共类PictureInfo {...}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.