在Entity Framework 7中显式映射接口成员

时间:2016-08-22 20:47:42

标签: c# entity-framework entity-framework-core

我正在尝试映射一个类似于下面的类,但我得到一个关于Facility.Projects属性作为接口的异常。

  

属性Facility.Projects是一个接口类型IProject。如果是导航属性,则通过将此属性转换为映射的实体类型来手动配置此属性的关系,否则忽略模型中的属性。

public class Facility : BaseData
{
    [ForeignKey("ClientId")]
    public Client Owner { get; set; }

    public List<IProject> Projects { get; protected set; }

    public Facility()
    {
        Initialize();
    }

    private void Initialize()
    {
        Projects = new List<IProject>();
    }
}

我已经通过OnModelCreating方法为Facility映射到HasColumnType的DbContext类映射了其他属性但我真的没有看到任何看起来像是除了{之外的其他地方{1}}也出现了错误。

public class FacilityRepository : BaseRepository<Facility>, IFacilityRepository
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder
            .Entity<Client>()
            .Property(f => f.Id)
            .ForSqliteHasColumnName("ClientId");

        modelBuilder
            .Entity<Project>()
            .Property(x => x.Id)
            .ForSqliteHasColumnName("ProjectId");


        // area where I've tried and failed to find a good spot to do some manual casting
        modelBuilder
            .Entity<Facility>()
            .Property(f => f.Projects)
            .HasColumnType<Project>(new PropertyBuilder());
    }
}

有人能指出我正确的方向吗?我没有在文档中看到任何可能有帮助的内容?或者,根据规则,我是不是应该这样做呢?

1 个答案:

答案 0 :(得分:3)

要进行一对多关系的手动映射(这个例子只是暴露父节点上的子节点,反之亦然),你可以按照如下方式设置它,然后它就非常简单了是:

        modelBuilder.Entity<ProjectState>()
            .HasMany(h => (ICollection<ProjectRoleState>)h.ProjectRoleStates)
            .WithOne()
            .HasForeignKey(p=>p.ProjectGuid);