And*_*rew 16 c# entity-framework ef-code-first table-splitting
我正在使用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; }
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误:实体类型'PictureInfo'和'Review'不能共享表'Review',因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系,它们之间具有匹配的主键.
我究竟做错了什么?
我已经成功地用流畅的api实现了你想要的东西.Fluent api提供了比数据注释更丰富的配置选项.我改变了你的实体类:
public class Review
{
public int Id { get; set; }
public PictureInfo PictureInfo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
不需要PictureInfoId属性,因为将在两个实体的主键上完成外键关系.
public class PictureInfo
{
public int Id { get; set; }
public Review Review { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
由于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; }
}
Run Code Online (Sandbox Code Playgroud)
OnModelCreating包含流畅的api映射定义.您所要做的就是在两个具有相同名称的实体上定义主键,将这两个实体绑定为1-1关系,然后将它们映射到同一个表.
似乎问题是这种关系被解释为一对一,而不是一对一.
int PictureInfoIdReview端的外键不需要/被忽略,因此其不可为空性并未使审查结束所需的关系.删除此不需要的密钥并将[Required]属性添加到PictureInfo导航属性解决了它.
这是更正后的评论课.
[Table("Review")]
public class Review
{
public int Id { get; set; }
[Required]
public PictureInfo PictureInfo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16204 次 |
| 最近记录: |