在Entity Framework 7中顯式映射接口成員

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映射到的DbContext類映射了其他屬性但是我並沒有真正看到任何看起來像是除了HasColumnType之外的正確位置,這也是錯誤的。

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());
    }
}

誰能指出我正確的方向?我在文檔中沒有看到任何可能有用的內容?或者,根據規則,我應該根本不這樣做嗎?

一般承認的答案

要做一對多關係的手動映射(這個例子只是暴露父節點上的子節點,反之亦然),你可以按如下方式設置它,然後在演員應該是的地方非常簡單:

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow