我的不同项目都在运行,不得不更改模型中的一件小事,这迫使我放弃表并重新创建它们。经过长时间的研究,我发现我必须使用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。
你可以做一些:
- 移除而不是插入触发器(对我有效)
- 关闭EF框架上下文中的验证。Configuration.ValidateOnSaveEnabled=false;(这也是工作)
希望它能帮助你。
我也遇到了这个问题,通过在的末尾添加下面的代码而不是插入触发器来解决这个问题。
SELECT SCOPE_IDENTITY() AS <IdFieldName>
对我来说,这是一个插入触发器问题。
带有用于调试的输出select语句的SQL代码保留在插入触发器中。
在触发器中注释掉有问题的select语句解决了问题。