实体框架表拆分:不在同一类型层次结构中/没有有效的一对一外键关系

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',因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系,它们之间具有匹配的主键.

我究竟做错了什么?

mr1*_*100 7

我已经成功地用流畅的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关系,然后将它们映射到同一个表.


And*_*rew 7

似乎问题是这种关系被解释为一对一,而不是一对一.

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)