具有标识''的成员在元数据集合中不存在。\ r \ nParameter name:identity

时间:2012-05-30 14:49:38

标签: asp.net-mvc linq ado.net

我在尝试调试时简化了一些代码:

[HttpPost]
    public ActionResult Register(User model)
    {
        DateTime bla = new DateTime(2012, 12, 12);
        try
        {
            User user = new User
            {
                gid = 1,
                cid = 1,
                firstName = model.firstName,
                lastName = model.lastName,
                email = model.email,
                username = model.username,
                password = model.password,
                creationDate = bla,
                active = 1
            };
            myContext.Users.AddObject(user);
            myContext.SaveChanges();

        }
        catch (Exception ex)
        {
            throw ex;
        }

        return View();               
    }

相应地传输这些值。用户表:

[id] [int] IDENTITY(1,1) NOT NULL,
[cid] [int] NULL,
[gid] [int] NULL,
[firstName] [nvarchar](100) NOT NULL,
[lastName] [nvarchar](100) NOT NULL,
[email] [nvarchar](max) NOT NULL,
[username] [nvarchar](100) NOT NULL,
[password] [nvarchar](100) NOT NULL,
[creationDate] [datetime] NOT NULL,
[active] [int] NOT NULL,

CONSTRAINT [PK_ 用户 _3213E83F0AD2A005] PRIMARY KEY CLUSTERED

我删除了所有外键以确保没有任何影响它。我确定在前一刻它工作正常,但现在我无法确定问题所在。 它在执行保存更改时崩溃:

{"An error occurred while updating the entries. See the inner exception for details."}
{"The member with identity '' does not exist in the metadata collection.\r\nParameter name: identity"}

10 个答案:

答案 0 :(得分:8)

问题是由于用户表上的触发器而重现。删除它,问题不再复制。

答案 1 :(得分:5)

当我尝试使用EF插入时,我遇到了同样的错误,错误是

The member with identity 'Id' does not exist in the metadata collection.\r\nParameter name: identity

一开始并不明显,但异常消息非常简洁,因为我的数据库知道列Id int但是为我的代码上的对象创建的属性是int ID所以回到命名映射,Id未映射到ID。

因此,当具有属性ID的对象被发送到仅知道Id的数据库时,您将收到上述错误。

我希望这有帮助,谢谢

答案 2 :(得分:4)

表上可能有一个触发器正在更新并返回输出。输出被丢弃,但它与EF冲突。这样的输出通常用于调试触发器(以后忘记删除):

select 'trigger called, i am here'

或者可能缺少变量:

select column 

而不是

select @variable=column 

答案 3 :(得分:2)

我认为最好的解决方案是this帖子。我使用了第3个选项并且有效。 在这里,我在链接中报告回复:

  

问题可能与"而不是插入"触发其中一个   你的桌子。

     

EF框架正在对插入的数据行执行验证   通过调用scope_identity()。然而,"而不是插入"触发   将以EF的方式改变插入的上下文   系统对scope_identity的调用将返回null。

     

有几种解决方法:

     
      
  1. 使用存储过程插入数据(未测试)
  2.   
  3. 删除而不是插入触发器(触发器可能会导致其他问题,因此有些人认为不会使用它们)(已测试,无效!)
  4.   
  5. 关闭EF框架中的验证,所以:context.Configuration.ValidateOnSaveEnabled = false(已测试,有效!)
  6.   

答案 4 :(得分:1)

我今天遇到了同样的错误,花了几个小时才想弄清楚。

我使用Entity Framework将带有标识列的记录插入到SQL Server数据库表中。很简单。

该表上有一个触发器,它依次运行存储过程。存储过程中有一行:

select newid()

这是破坏实体框架的一条线。

对于具有标识列的表,Entity Framework期望返回一行,其中一个字段是标识列。

答案 5 :(得分:1)

有时候,我讨厌M $。

元数据集合中不存在标识为“ ChangeID”的成员。 参数名称:identity

我花了两天时间来解决这个问题。

我正在使用MVC。

要一口气获得所有我需要的数据,我在数据库中为此应用程序创建了表的视图,并在其他数据库中创建了表的视图。 (您可能会在有一些约束的情况下更新视图。)

我进行获取,我的所有数据都存在于记录,键,描述,外键等中。

我在视图上创建了触发器,以更新视图中来自本地表的部分。

代替Delete可以正常工作。 而不是更新工作正常。

此错误不断抬起头,而不是插入。我无法获得成功插入到表中的插入触发器。如果我在视图上运行了插入操作,并在SQL Management Studio中提供了所有字段,则可以正常工作。我知道要传递的确切值,因为我运行SQL Server Profiler来查看正在传递的代码。

但是当应用尝试更新时,它失败并显示元数据集合中不存在标识为“ ChangeID”的成员。

在上面提示,有人说:“ MVC希望表键为 ID

我在视图中将ChangeID重命名为ID,并在应用程序中将其更改为BAM!现在可以了。

什么不起作用:

  • db.Configuration.ValidateOnSaveEnabled = false;
  • 在触发器中添加一个选择以获得作用域身份

为什么必须修改数据库或视图以满足某些隐藏的M $假设?

无论如何,经过两天令人沮丧的日子,代码现在可以正常工作了。也许这也会为其他人节省一些时间。

答案 6 :(得分:0)

试试这个

[HttpPost]
public ActionResult Register(User model)
{
    DateTime bla = new DateTime(2012, 12, 12);
    try
    {
        model.gid = 1;
        model.cid = 1;
        model.creationDate = bla;
        model.active = 1;

        myContext.Users.AddObject(model);
        myContext.SaveChanges();

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
        throw;
    }

    return View();               
}

答案 7 :(得分:0)

我遇到了这个问题,我的修复是,在我的连接字符串元数据中,我没有以.msl格式指定我的模型。

See more info here

答案 8 :(得分:0)

这是因为触发器将值传回EF 如果您使用触发器。在我的问题中,我必须通过从其他表中进行选择并使用EF中的“选择”原因错误来检查值,因此您必须将“选择”替换为“设置”。 您不能使用此代码。

select @any= any from tablename  

您应该使用set而不是select

set @any= (select any from tablename)

答案 9 :(得分:-1)

这是Google在搜索产生此错误消息的问题版本的解释时返回的第一页,因此我将在此处提及,以及解决方案对我而言。

在我的问题版本中,违规代码如下所示:

    foreach (var comp in colorstyle.Companions)
        comp.LinkCS = db.ColorStyles.Find(comp.LinkColorStyleId);

我继承了维护和支持包含此代码的应用程序的工作。此代码将导航属性设置为已经相关的实体,使用相同对象的关联外键属性作为查找。这完全是不必要的,有时似乎......并不总是......产生这个错误:

"具有身份的成员' Customization_ColorStyleCustomizations_Source'元数据集合中不存在。参数名称:identity"

这是一个非常错误的信息,不是。

两年来,这段代码坐在那里没有丢失任何错误,然后突然有一天,它开始为某些颜色样式产生这个错误。 /抖动。我不明白。但它没有必要,拿出来解决问题,所以。为了防止其他人遇到同样的问题,这就是。

(如果它不清楚 - 在这种情况下,解决方案只是删除代码。)