【问题标题】:Entity Framework "The member [...] does not exist in the metadata collection实体框架“元数据集合中不存在成员 [...]
【发布时间】:2016-08-04 09:50:37
【问题描述】:

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

身份为“SGDB.DAL.Contexts.Person_Department”的成员确实 元数据集合中不存在。参数名称:身份。

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

是的,我已经阅读了有关此主题的其他主题,但解决方案是为每个外键(在我的情况下为 Person.cs 中的 DepartmentId)创建一个 Id 属性,但我不喜欢这样 - 特别是因为我知道以前工作过。

可能是什么原因?

更新 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();

    }

【问题讨论】:

    标签: c# entity-framework exception datacontext


    【解决方案1】:

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

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

    您可以执行以下操作:

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

    希望对你有所帮助。

    【讨论】:

    • 关闭验证并没有解决我的问题。您第一次提到的解决方案尝试是如何工作的?我对 EF 很陌生-我正在将一个新部门播种到数据库中,并在播种新人时调用此数据集 (var department = new DepartmentContext().Departments.First();) - 或者这可能是问题?如果是这样 - 我应该如何从数据库中检索数据以插入一个新人?
    【解决方案2】:

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

    SELECT SCOPE_IDENTITY() AS <IdFieldName>
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多