如何使用Entity Framework重用其他外键中自动包含的外键属性?

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

编辑:This question 这里清楚地表明这是 Entity Framework 的架构问题,不支持对这些类型的继承属性使用外键。

当 Entity Framework 从抽象基础 class 中提取 属性 (CompanyId) 用作外键时,我如何另外使用那个 属性没有收到以下错误或添加重复数据的其他属性的外键?

我已经包括了之前的开发人员得到的输出,我想要得到的,以及为什么它们最后不同。问题是是否可以让生成的迁移重用 CompanyId 字段。

错误信息:

外键组件 'CompanyId' 不是在类型 'XXXNote' 上声明的 属性。验证它没有被显式地从模型中排除,并且它是一个有效的原语 属性.

映射class:

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 class:

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

XXX注class:

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

    public virtual XXX XXX { get; set; }
}

注class:

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

    public string Description { get; set; }
}

公司对象class:

// 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 class:

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

附加上下文:

之前的开发人员通过向 XXXNote class 添加新的 属性、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 });

This question 这里清楚地表明这是 Entity Framework 的架构问题,并且不支持对这些类型的继承属性使用外键。

我最初把这个放在问题的顶部,但仍然有人发表评论,所以我将问题标记为已回答以停止浪费人们的时间。