[英]EF Core Navigating to 2 Properties of the Parent Class Issue
我正在我创建的一个新类上运行迁移,其中有 2 个对象引用相同类型的不同对象。 这是课堂
public class AccountOpenerWorkflowStep
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime ModifiedDate { get; set; }
public string Controller { get; set; }
public string Action { get; set; }
public bool DefaultStep { get; set; }
[Column("TrueWorkflowStepId")]
public virtual AccountOpenerWorkflowStep TrueWorkflowStep { get; set; }
[Column("FalseWorkflowStepId")]
public virtual AccountOpenerWorkflowStep FalseWorkflowStep { get; set; }
}
所以我的两个属性TrueWorkflowStep
和FalseWorkflowStep
将指向同一个表中的其他对象。
问题是当我运行此迁移时,它只创建列FalseWorkflowStep
而不是 True 列。
这是迁移中的一个例外
migrationBuilder.CreateTable(
name: "AccountOpenerWorkflowSteps",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn),
CreatedDate = table.Column<DateTime>(nullable: false),
ModifiedDate = table.Column<DateTime>(nullable: false),
Controller = table.Column<string>(nullable: true),
Action = table.Column<string>(nullable: true),
DefaultStep = table.Column<bool>(nullable: false),
FalseWorkflowStepId = table.Column<int>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_AccountOpenerWorkflowSteps", x => x.Id);
table.ForeignKey(
name: "FK_AccountOpenerWorkflowSteps_AccountOpenerWorkflowSteps_False~",
column: x => x.FalseWorkflowStepId,
principalTable: "AccountOpenerWorkflowSteps",
principalColumn: "Id",
onDelete: ReferentialAction.SetNull);
});
如您所见,它仅插入了同一类型的一列。
谁能告诉我为什么它不能识别这两列?
[Column]
属性在这里不合适,因为它应该应用于原始属性,而不是引用。 EF只是忽略属性(使用不同的列名来确认这一点),退回其默认映射约定-然后失败。
昨天我偶然发现了一个类似的问题 。 EF的默认约定似乎很难在一个类中处理两个统一的关系。
我没有在Npgsql中尝试您的模型,但是使用Sql Server EF同样失败。 解决方案是使用正确的属性:
[ForeignKey("TrueWorkflowStepId")]
public virtual AccountOpenerWorkflowStep TrueWorkflowStep { get; set; }
[ForeignKey("FalseWorkflowStepId")]
public virtual AccountOpenerWorkflowStep FalseWorkflowStep { get; set; }
或流利的映射:
modelBuilder.Entity<AccountOpenerWorkflowStep>().HasOne(x => x.TrueWorkflowStep).WithMany()
.HasForeignKey("TrueWorkflowStepId").IsRequired(false);
modelBuilder.Entity<AccountOpenerWorkflowStep>().HasOne(x => x.FalseWorkflowStep).WithMany()
.HasForeignKey("FalseWorkflowStepId").IsRequired(false);
这是解释
EF Core仅支持每种实体类型在模型中具有一个映射。 即,没有任何支持的情况,其中相同类型的两个实例最终可能存储在不同的表或不同的列中。
如果您想要这样的东西,可以尝试几种方法。 最合适的一种取决于您的方案:
具有两个不同类型的两个DbSet。 两种类型都可以从通用基本类型继承(甚至在其所有属性中定义),只要该基本类型未在EF Core模型中进行映射即可。
具有两个单独的派生DbContext类型,这些类型将Venda类型映射到不同的表。
因此,我建议您尝试添加从基类继承相同属性的其他类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.