问题映射同一关系类型的EF多个

时间:2017-02-05 11:33:35

标签: entity-framework fluent

我有两个POCO实体类

public class Model
{
    public long Id { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }


    // Relationships    
    public virtual ICollection<Shoot> PhotoSets { get; set; }
    public virtual ICollection<Shoot> FilmSets { get; set; }

}

public class Shoot
{
    public long Id { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }
    public string ShootType { get; set; }

    // Relationships
    public long ModelId { get; set; }
    public virtual Model Model { get; set; }

}

所以我只想要一个由Model上的ICollection导航属性定义的多个类型的表。如果我按惯例生成EF,它会创建Model_dId作为我想要避免的额外属性。在我的Fluent映射ModelConfiguration类中,我尝试了这个:

this.HasMany(m => m.FilmSets)
    .WithRequired(sh => sh.Model)
    .HasForeignKey(sh => sh.ModelId);

this.HasMany(m => m.PhotoSets)
    .WithRequired(sh => sh.Model)
    .HasForeignKey(sh => sh.ModelId);

并获取Additional information: Schema specified is not valid. Errors: The relationship 'PronHunter.Database.Model_FilmSets' was not loaded because the type 'PronHunter.Database.Shoot' is not available.

我尝试使用ShootConfiguration定义两个路径:

this.HasRequired(sh => sh.Model)
    .WithMany(m => m.PhotoSets)
    .HasForeignKey(sh => sh.ModelId);

this.HasRequired(sh => sh.Model)
    .WithMany(m => m.FilmSets)
    .HasForeignKey(sh => sh.ModelId);

在第一次查询时构建数据库但仍生成额外的Model_Id列。事实上,我也尝试将ModelId重命名为ModelaaaId但最后我得到了三个列,ModelaaaId,ModelId和Model_id,所以EF无论如何都忽略了我的显式命名。

所以我的感觉是很多场景,但是我尝试过一些例子,但是我没有看到任何智能感知的MapLeftColumn,并且不是很多场景无论如何。它是我想要定义的两个man,好像我在T-SQL中定义了两个内连接。

任何人都知道我该怎么做?

1 个答案:

答案 0 :(得分:0)

看起来您已经准备好使用TPH并ShootType作为您的鉴别者 - 从{{1}中派生出两种新类型(例如FilmSetPhotoSet)然后按照this MSDN article中的描述配置鉴别器Shoot。然后,您可以将这些类型用于两个不同的集合:

ShootType

或者,您可以创建两个未映射的属性来过滤单个映射的集合。但是,您需要使用单个映射集合进行添加/删除操作:

public class FilmSet : Shoot {}
public class PhotoSet : Shoot {}

// DbContext model configuraiton
modelBuilder.Entity<Shoot>()  
    .Map<FilmSet>(m => m.Requires("ShootType").HasValue("Film Set"))  
    .Map<PhotoSet>(m => m.Requires("ShootType").HasValue("Photo Set"));

public class Model
{
    public virtual ICollection<FilmSet> FilmSets { get; set; }
    public virtual IColelction<PhotoSet> PhotoSets { get; set; }
}