实体框架"成员 [...]元数据集合中不存在



我的不同项目都在运行,不得不更改模型中的一件小事,这迫使我放弃表并重新创建它们。经过长时间的研究,我发现我必须使用Initializers(DropCreateDatabaseAlways)。此外,我还创建了一些自定义初始化程序,用测试数据为数据库种子。现在,每次运行应用程序时,我都会收到以下异常:

标识为"SGDB.DAL.Contexts.Person_Department"的成员执行元数据集合中不存在。参数名称:identity。

在我改变我的模型(与个人和部门之间的关系无关)之前,一切都很好。此外,我的所有模型的标识符都命名为Id(正如EF所期望的那样),并用[Key]属性进行装饰。

是的,我已经阅读了关于这个主题的其他线程,但解决方案是为每个外键创建一个Id属性(在我的例子中是Person.cs中的DepartmentId),但我不喜欢这样,尤其是因为我知道它以前有效。

原因可能是什么?

更新1:

我正在努力培养新人如下:

protected override void Seed(PersonContext context) {
        base.Seed(context);
        var dep = new DAL.Contexts.DepartmentContext().Departments.First();
        var status = new Status {
            StatusType = "Test"
        };
        var persondata = new PersonData {
            Status = status
        };
        context.Status.Add(status);
        context.PersonData.Add(persondata);
        for (int i = 0; i < 10; i++) {
            var person = new Person {
                Firstname = $"TestPersonFirstname{i}",
                Lastname = $"TestPersonLastname{i}",
                SourceType = COM.SourceType.Manual,
                Department = dep,
                PersonData = persondata
            };
        context.Persons.Add(person);
        }

        context.SaveChanges();
    }

我也遇到了同样的问题。我的问题与我的一个表上的"而不是插入"触发器有关。

EF框架通过调用scope_identity()对插入的数据行执行验证。但是,"而不是插入"触发器将更改插入的上下文,使得EF系统对scope_identity的调用将返回null。

你可以做一些:

  1. 移除而不是插入触发器(对我有效)
  2. 关闭EF框架上下文中的验证。Configuration.ValidateOnSaveEnabled=false;(这也是工作)

希望它能帮助你。

我也遇到了这个问题,通过在的末尾添加下面的代码而不是插入触发器来解决这个问题。

SELECT SCOPE_IDENTITY() AS <IdFieldName>

对我来说,这是一个插入触发器问题。

带有用于调试的输出select语句的SQL代码保留在插入触发器中。

在触发器中注释掉有问题的select语句解决了问题。

最新更新