簡體   English   中英

如何使用Entity Framework自動重用其他外鍵中包含的外鍵屬性?

[英]How to reuse automatically included foreign key properties in other foreign keys, with Entity Framework?

編輯: 這里的問題清楚表明這是實體框架的體系結構問題,並且不支持具有此類繼承屬性的外鍵。

當Entity Framework從抽象基類中提取屬性(CompanyId)用作外鍵時,如何在其他外鍵中使用該屬性而又不會出現以下錯誤或添加重復數據的其他屬性?

我已經包括了以前的開發人員得到的輸出,我想要得到什么,以及為什么它們最終不同。 問題是是否有可能使生成的遷移重用CompanyId字段。

錯誤信息:

外鍵組件'CompanyId'不是類型為'XXXNote'的聲明屬性。 驗證尚未將其顯式排除在模型之外,並且它是有效的原始屬性。

映射類:

class XXXNoteMap : CompanyObjectMap<XXXNote>
{
    public XXXNoteMap()
    {
        Map(m => m.ToTable("db_XXXNote"));
        HasKey(k => new { k.CompanyId, k.Id });
        HasRequired(c => c.XXX).WithMany().HasForeignKey(k => new { k.CompanyId, k.XXXId });
    }
}

CompanyObjectMap類:

public class CompanyObjectMap<T> : EntityTypeConfiguration<T>
    where T:CompanyObject
{
    public CompanyObjectMap()
    {
        this.HasRequired(c => c.Company).WithMany().HasForeignKey(c => c.CompanyId);
    }
}

XXXNote班級:

public class XXXNote : Note
{
    public Guid XXXId { get; set; }

    public virtual XXX XXX { get; set; }
}

筆記類別:

public abstract class Note : CompanyObject
{
    public Guid Id { get; set; }

    public string Description { get; set; }
}

CompanyObject類:

// The ICompanyObject interface can be removed and the problem remains.
public abstract class CompanyObject : DataObject, ICompanyObject
{
    // Removing the virtual keyword has no effect.
    public virtual Guid CompanyId { get; set; }

    public virtual Company Company { get; set; }
}

ICompanyObject類:

// This interface can be removed and the problem remains.
public interface ICompanyObject
{
    Guid CompanyId { get; set; }
}

其他內容:

以前的開發人員通過在XXXNote類XXXCompanyId中添加新屬性來解決此問題。 然后,他們在手動創建的外鍵中使用了它,而不是在上面嘗試使用的自動包含的CompanyId中。

以前的開發人員使用壞方法生成的舊錯誤代碼:

        CreateTable(
            "dbo.db_XXXNote",
            c => new
                {
                    CompanyId = c.Guid(nullable: false),
                    Id = c.Guid(nullable: false),
                    XXXId = c.Guid(nullable: false),
                    XXXCompanyId = c.Guid(nullable: false),
                })
            .PrimaryKey(t => new { t.CompanyId, t.Id })
            .ForeignKey("dbo.db_Note", t => new { t.CompanyId, t.Id })
            .ForeignKey("dbo.db_XXX", t => new { t.XXXCompanyId, t.XXXId })
            .Index(t => new { t.CompanyId, t.Id })
            .Index(t => new { t.XXXCompanyId, t.XXXId });

所需的輸出:

        CreateTable(
            "dbo.db_XXXNote",
            c => new
                {
                    CompanyId = c.Guid(nullable: false),
                    Id = c.Guid(nullable: false),
                    XXXId = c.Guid(nullable: false),
                })
            .PrimaryKey(t => new { t.CompanyId, t.Id })
            .ForeignKey("dbo.db_Note", t => new { t.CompanyId, t.Id })
            .ForeignKey("dbo.db_XXX", t => new { t.CompanyId, t.XXXId })
            .Index(t => new { t.CompanyId, t.Id })
            .Index(t => new { t.CompanyId, t.XXXId });

這里的問題清楚表明這是Entity Framework的體系結構問題,並且不支持具有此類繼承屬性的外鍵。

我最初將其放在問題的頂部,但是仍然有人發表評論,因此我將問題標記為已回答,以免浪費人們的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM