如何使用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 的架构问题,并且不支持对这些类型的继承属性使用外键。
我最初把这个放在问题的顶部,但仍然有人发表评论,所以我将问题标记为已回答以停止浪费人们的时间。
编辑: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 的架构问题,并且不支持对这些类型的继承属性使用外键。
我最初把这个放在问题的顶部,但仍然有人发表评论,所以我将问题标记为已回答以停止浪费人们的时间。