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

时间:2016-04-13 10:46:29

标签: c# entity-framework exception datacontext

我让不同的项目工作,不得不在模型中改变一个小东西,迫使我放弃我的表并重新创建它们。经过长时间的研究,我发现我必须使用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();

    }

3 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我的问题与我的一张桌子上的“而不是插入”触发器有关。

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

您可以执行以下操作之一:

  1. 删除而不是插入触发器(为我工作)。
  2. 关闭EF框架上下文中的验证.Configuration.ValidateOnSaveEnabled = false; (这也是 工作)
  3. 希望它会对你有所帮助。

答案 1 :(得分:0)

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

SELECT SCOPE_IDENTITY() AS <IdFieldName>

答案 2 :(得分:0)

对我而言,这是一个插入触发器问题。

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

在触发器中注释掉违规的select语句解决了这个问题。