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

时间:2015-09-28 21:33:00

标签: c# entity-framework ef-migrations

编辑:This question这里明确指出这是Entity Framework的架构问题,并且不支持将这些类的继承属性用于外键。

当Entity Framework从抽象基类中提取属性(CompanyId)以用作外键时,如何在其他外键中使用该属性而不会出现以下错误或添加复制数据的其他属性?< / p>

我已经包含了之前开发人员获得的输出,以及我想要获得的内容,以及为什么他们最终会有所不同。问题是是否有可能使生成的迁移重用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);
    }
}

XXX注意类

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

1 个答案:

答案 0 :(得分:0)

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

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