如何使用实体框架自动重用其他外键中包含的外键属性

本文关键字:包含 属性 其他 实体 何使用 框架 | 更新日期: 2023-09-27 18:15:10

编辑:这里的问题清楚地表明这是实体框架的体系结构问题,并且不支持对这些类型的继承属性使用外键。

当实体框架从抽象基类中提取属性(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 });

如何使用实体框架自动重用其他外键中包含的外键属性

这个问题清楚地表明,这是实体框架的体系结构问题,并且不支持对这些类型的继承属性使用外键。

我本来把这个放在问题的顶部,但是有人仍然评论,所以我把问题标记为回答,以避免浪费人们的时间。

相关文章: