我正在使用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',因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系,它们之间具有匹配的主键 .
我究竟做错了什么?
6 回答
我已经成功地用流畅的api实现了你想要的东西 . Fluent api提供了比数据注释更丰富的配置选项 . 我改变了你的实体类:
不需要PictureInfoId属性,因为将在两个实体的主键上完成外键关系 .
由于Review和PictureInfo将映射到同一个表,因此需要共享相同的主键列,因此对于PictureInfo和Review,此列应具有相同的名称 . 如果您想保留名为ReviewId的PictureInfo主键属性,则可以执行此操作,但您需要将其名称映射到“Id” . 最后的DbContext:
OnModelCreating包含流畅的api映射定义 . 您所要做的就是在两个具有相同名称的实体上定义主键,将这两个实体绑定为1-1关系,然后将它们映射到同一个表 .
似乎问题是这种关系被解释为一对一,而不是一对一 .
审阅结束时的外键
int PictureInfoId
不需要/被忽略,因此其不可空性不会使审阅结束所需的关系 . 删除此不需要的密钥并将[Required]属性添加到PictureInfo导航属性解决了它 .这是更正后的评论课 .
解决此问题的另一种方法是创建仅包含所需字段的视图 . 然后将实体映射到视图 .
(这些测试和错误是针对EF 6.1.3编写的)
第一次尝试
有了上述实体,我收到了这个错误:
第二次尝试
第三次尝试
工作代码
导致该错误的原因是表的定义在表“PictureInfo”的指令中重复 . 您只需要编辑该指令 .
对于