我让不同的项目工作,不得不在模型中改变一个小东西,迫使我放弃我的表并重新创建它们。经过长时间的研究,我发现我必须使用Initializers(DropCreateDatabaseAlways)。另外,我创建了一些自定义初始化程序来为我的数据库种子测试数据现在,每次运行我的应用程序时,都会收到以下异常:
具有身份的成员' SGDB.DAL.Contexts.Person_Department'不 元数据集合中不存在。参数名称:identity。
在我改变模型之前(与人与部门之间的关系无关)一切正常。此外,我所有模型的标识符都被命名为Id(如EF所期望的那样),并使用[Key]属性进行修饰。
是的,我已经阅读了有关此主题的其他主题,但解决方案是为每个外键创建一个Id属性(在我的例子中是Person.cd中的PersonId)但我不喜欢这样 - 特别是因为我知道它以前工作过。
可能是什么原因?
更新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();
}
答案 0 :(得分:0)
我遇到了同样的问题。我的问题与我的一张桌子上的“而不是插入”触发器有关。
EF框架通过调用scope_identity()对插入的数据行执行验证。但是,“而不是插入”触发器将更改插入的上下文,以便EF系统对scope_identity的调用将返回null。
您可以执行以下操作之一:
希望它会对你有所帮助。
答案 1 :(得分:0)
我也遇到了这个问题,它通过将下面的代码添加到而不是插入触发器的末尾来修复。
SELECT SCOPE_IDENTITY() AS <IdFieldName>
答案 2 :(得分:0)
对我而言,这是一个插入触发器问题。
带有用于调试的输出select语句的SQL代码保留在插入触发器中。
在触发器中注释掉违规的select语句解决了这个问题。