【问题标题】:The member with identity does not exist in the metadata collection. Parameter name: identity元数据集合中不存在具有身份的成员。参数名称:身份
【发布时间】:2012-04-14 20:21:33
【问题描述】:

我们使用的是 EF Code First 4.3.1。 我们正在开发一个引用多个类库的 ASP.NET Web 角色。 有两个类库,每个都包含类和一个单独的 DBcontext。

假设 Library1 有 A 类和 B 类。 DBcon1:DbSet 和 DbSet

假设 Library2 有 C 类和 D 类。 C类{ [钥匙] 公共 int CId{ 获取;设置;}

[Required]
public virtual A referencedA {get; set;}
}
DBcon2: DbSet<C> and DbSet<D>

当我尝试使用 DBcon2 时:

        using (var con = new DBcon2())
        {
            C vr = new C();
            vr.CId= 1;
            vr.referencedA = DBCon1.As.First();
            con.Cs.Add(vr);
            con.SaveChanges();
        }

我得到一个例外: “元数据集合中不存在具有身份的成员。 参数名称:身份"

DBCon1 和 DBcon2 都在使用健全的 SQL Server 数据库“SampleDB”。

请指点我正确的方向。

【问题讨论】:

    标签: asp.net sql-server entity-framework code-first


    【解决方案1】:

    我得到了这个错误并通过不尝试在相关表中设置导航属性来修复它,而只是设置外键 id

    例如

    public class Student()
    {
        public int StudentId { get; set; }
        public string StudentName { get; set; }
        public int CourseId { get; set; }
        public virtual Course Course { get; set; }
    }
    
    public class Course()
    {
        public int CourseId { get; set; }
        public string CourseName { get; set; }
        public virtual ICollection<Student> Students { get; set; }
    }
    

    主要代码:

    var myCourse = new Course();
    var myCourseId = 1;
    
    var student = new Student() {
        CourseId = myCourseId
        // Course = myCourse <-- this would cause the error
    }
    

    可能不是您的问题,但它可能会为您指明正确的方向,并希望对其他人有所帮助。

    【讨论】:

      【解决方案2】:

      这个例外有点神秘,但如果你意识到上下文需要有关实体(元数据)的信息才能编写 sql 语句,那就很清楚了。因此,您的 DBcon2 上下文不知道在哪里可以找到 A 的主键,因为它没有关于 A 的元数据。

      但是,您可以设置一个整数属性 A_Id(或类似的),但是您必须编写自定义代码来将其解析为 A

      如果可能,另一种选择是合并(部分)上下文。

      【讨论】:

      • 你能清楚如何合并上下文吗?你是什​​么意思?另外,A 有一个密钥并且 DBcon1 知道,我们如何告诉 DBCon2??
      • 由于上下文位于同一个数据库中,您可以将所有类放在一个上下文中。这不是什么神奇的合并命令,而只是手动重构数据层。
      • 我们希望保持 DataContext 不同,因为我们希望核心 DBCon1 独立于添加的其他模块。您能否推荐如何进行并告知 DBCon2 A 的元数据?
      • 你需要将A加入到DBCon2的上下文中,并郑重使用,仅供参考,所以DBCon1用于A的维护。
      猜你喜欢
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 2023-03-28
      • 2011-06-10
      相关资源
      最近更新 更多