EF插入DB生成的密钥,忽略DatabaseGeneratedOption.None

本文关键字:忽略 DatabaseGeneratedOption None 密钥 插入 DB EF | 更新日期: 2023-09-27 18:27:49

我使用的是EF 6.1.3 Code First。

我有两个班:

  • 员工
  • 决策

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

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

因此,我将属性DatabaseGeneratedOption.None添加到Employee.EmployeeID:中,如下所示

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]

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

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

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

所以,这没有帮助。

手动编辑此迁移(即,将identity设置为false)会在尝试保存上下文时引发错误:InnerException = {"Cannot insert the value NULL into column 'EmployeeID', table '[...]DBContext.dbo.Employees'; column does not allow nulls. INSERT fails. The statement has been terminated."}

尽管上下文的本地DBSet中的EmployeeID是正确的(不是null,不是生成的)。

我一直在寻找一个解决方案,但我能想到的只是围绕的次优工作:向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)));
                    }
                }
            }
        }

[依此类推]

EF插入DB生成的密钥,忽略DatabaseGeneratedOption.None

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

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