gpt4 book ai didi

c# - EF 和 TPT : the column name is specified more than once in the SET clause

转载 作者:太空狗 更新时间:2023-10-29 21:53:21 24 4
gpt4 key购买 nike

我正在使用 EF 6 并使用 TPT 策略来模拟我的问题。Rule 是一个抽象类。 OvertimeRule是一个具体类,继承自Rule

规则 看起来像这样:

public abstract class Rule
{
public int Id { get; set; }
public PeriodType PeriodType { get; set; }
public int SortOrder { get; set; }
public int StatuteId { get; set; }
public bool IsActive { get; set; }
}

OvertimeRule 看起来像这样:

public partial class OvertimeRule : Rule
{
public decimal? ThresholdCoefficient { get; set; }
public decimal? LimitCoefficient { get; set; }
}

当我创建一个新的 OvertimeRule 并尝试保存它时,EF 首先生成此查询:

INSERT [dbo].[Rules]([PeriodType], [SortOrder], [StatuteId], [IsActive], [StatuteID])
VALUES (@0, @1, @2, @3, @4, @5, @6, NULL)

如您所见,EF 向插入添加了一个 StatuteID 列,该列在解决方案中的任何位置都不存在,并使其成为无效的 SQL 查询。

然后 SQL 正确地抛出:列名称“StatuteId”在 SET 子句中指定了多次。在同一 SET 子句中不能为一列分配多个值。修改 SET 子句以确保列只更新一次。如果 SET 子句更新 View 的列,则列名“StatuteId”可能会在 View 定义中出现两次。

映射看起来像这样:

        modelBuilder.Entity<Rule>().ToTable("Rules", TimmiSchemaName);
modelBuilder.Entity<Rule>().HasRequired(s => s.Statute).WithMany(s => s.Rules).HasForeignKey(r => r.StatuteId);
modelBuilder.Entity<OvertimeRule>().ToTable("OverTimeRules", TimmiSchemaName);

谁能告诉我什么会触发这种行为?

最佳答案

这个很棘手。

modelBuilder.Entity<Rule>().HasRequired(s => s.Statute).WithMany().HasForeignKey(r => r.StatuteId);

实际上是不正确的,应该是

modelBuilder.Entity<Rule>().HasRequired(s => s.Statute).WithMany(s => s.Rules).HasForeignKey(r => r.StatuteId);

因为属性 statute.Rules 存在于外键的另一边。

如果没有它,EF 会尝试将该属性自动映射到 Rules 表中的一个 sql 列,他猜这应该是 StatuteID

关于c# - EF 和 TPT : the column name is specified more than once in the SET clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35059738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com