gpt4 book ai didi

c# - EF 插入数据库生成的 key ,忽略 DatabaseGeneratedOption.None

转载 作者:行者123 更新时间:2023-11-30 17:40:18 25 4
gpt4 key购买 nike

我正在使用 EF 6.1.3 Code First。

我有 2 个类:

  • 员工
  • 决定

员工是从一个文件中加载的,每个文件都包含一个唯一的 EmployeeID

我的应用程序允许用户输入并保存有关这些员工的新决策。但是,当 EF 将新决策保存到 DBContext 时,EF 会使用 DB 生成的值覆盖员工的 EmployeeID

因此,我向 Employee.EmployeeID 添加了属性 DatabaseGeneratedOption.None:

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

接下来,我删除了数据库,删除了所有迁移,并添加了一个新迁移

但是,此迁移将 identity(“指示 DB 是否会在插入期间为该列生成值的值”)设置为 true:

CreateTable(
"dbo.Employees",
c => new
{
EmployeeID = c.Int(nullable: false, identity: true),

...所以,这没有帮助。

手动编辑此迁移(即,将 identity 设置为 false)会导致在尝试保存上下文时抛出错误:InnerException = {“无法将值 NULL 插入列‘EmployeeID’,表‘[...]DBContext.dbo.Employees’;列不允许空值。INSERT 失败。语句已终止。”

...尽管上下文的 Local DBSet 中的 EmployeeID 是正确的(不为空,未生成)。

我一直在寻找解决方案,但我能想到的只是一个次优解决方案:向 Employee 添加另一个非关键属性。

我尝试过的其他方法,但无济于事:

  • 使用自动迁移

  • 将 [ForeignKey("EmployeeID")] 添加到 Decision.Employee


编辑:应 E-Bat 的要求,以下是我的实体的摘录:

public class Employee : INotifyPropertyChanged
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
private int _employeeID;
public int EmployeeID
{
get { return _employeeID; }
set
{
if (value != _employeeID)
{
_employeeID = value;

if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(nameof(EmployeeID)));
}
}
}
}

[等等]

   public class Decision : INotifyPropertyChanged
{
private int _decisionID;
public int DecisionID
{
get { return _decisionID; }
set
{
if (value != _decisionID)
{
_decisionID = value;

if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(nameof(DecisionID)));
}
}
}
}

private Employee _employee;
public Employee Employee
{
get { return _employee; }
set
{
if (value != _employee)
{
_employee = value;

if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(nameof(Employee)));
}
}
}
}

[等等]

最佳答案

您实际上将映射属性应用于支持变量 _employeeID,您需要改为将其应用于属性:

public class Employee : INotifyPropertyChanged
{
private int _employeeID;
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int EmployeeID
{
get { return _employeeID; }
set
{
//Code omitted
}
}

关于c# - EF 插入数据库生成的 key ,忽略 DatabaseGeneratedOption.None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34439515/

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