c# - EF Core 导航到父类问题的 2 个属性
问题描述
我正在我创建的一个新类上运行迁移,其中有 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);
推荐阅读
- react-native - 无需调用 componentWillUnmount 即可重新创建组件
- apache-kafka - MeteredKeyValueStore 中的 Kafka 流 NPE
- reactjs - 无状态功能组件更新而有状态版本不更新
- c# - 单击按钮时如何展开组框
- gitlab - Readme.md 中的 GitLab 参考子模块
- javascript - 有没有办法将按钮 id onClick 发送到引导模式?
- xpath - 如何使用 XPath 在 PMD 中检查 Apex 源字符串?
- android - 如果 url 字符串包含“~”符号,则改造调用错误的 url 导致 404 错误
- mysql - duplicate record occur in mysql
- laravel - “无法打开流或文件“/srv/storage/logs/laravel-2019-01-09.log”:无法打开流:只读文件系统”