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

问题描述 投票:7回答:9

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

[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_Users_3213E83F0AD2A005] PRIMARY KEY CLUSTERED

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

{"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"}
asp.net-mvc linq ado.net
9个回答
8
投票

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


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的数据库时,您将得到上述错误。

我希望这有帮助,谢谢


4
投票

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

select 'trigger called, i am here'

或者可能缺少变量:

select column 

代替

select @variable=column 

2
投票

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

该问题可能与您的某个表上的“而不是插入”触发器有关。

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

有几种方法:

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

1
投票

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

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

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

select newid()

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

对于具有标识列的表,实体框架期望返回一行,其中一个字段是标识列。


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();               
}

0
投票

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

See more info here


0
投票

这是因为如果使用触发器,触发器会将值传回EF。在我的问题中,我必须通过从其他表中选择并在EF中使用'select'导致错误来检查值,因此您必须将'select'替换为'set'。你不能使用这个代码。

select @any= any from tablename  

你应该使用set而不是select

set @any= (select any from tablename)

-1
投票

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

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

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

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

“具有标识'Customization_ColorStyleCustomizations_Source'的成员在元数据集合中不存在。参数名称:identity”

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.