12

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

[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,

约束 [PK_用户_3213E83F0AD2A005] 主键集群

我删除了所有外键以确保没有任何影响。我很确定它在前一刻可以正常工作,但现在我无法弄清楚问题出在哪里。它在执行 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"}
4

10 回答 10

11

当我尝试使用 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你会得到上述错误。

我希望这会有所帮助,谢谢

于 2014-02-15T23:34:49.617 回答
10

由于用户表上的触发器,问题正在重现。删除它,问题不再重现。

于 2012-05-31T08:49:01.017 回答
7

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

select 'trigger called, i am here'

或者可能缺少变量:

select column 

代替

select @variable=column 
于 2015-08-17T22:39:01.160 回答
4

我认为最好的解决方案在这篇文章中。我使用了第三个选项并且有效。在这里,我报告了链接中的回复:

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

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

解决这个问题的几种方法:

  1. 使用存储过程插入数据(未测试)
  2. 删除而不是插入触发器(触发器可能会导致其他问题,因此有些人认为不要使用它们)(经过测试,有效!)
  3. 关闭 EF 框架中的验证,因此: context.Configuration.ValidateOnSaveEnabled = false (已测试,有效!)
于 2014-07-28T09:27:22.433 回答
1

我今天遇到了同样的错误,花了几个令人沮丧的时间试图弄清楚。

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

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

select newid()

这是破坏实体框架的线。

对于具有标识列的表,Entity Framework 期望返回具有单个字段的单行,即标识列。

于 2014-07-31T03:47:31.327 回答
1

有时候,我讨厌 M$。

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

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

我正在使用 MVC。

为了一举获得我需要的所有数据,我为此应用程序创建了数据库中表的视图,以及其他数据库中的表。(您可以更新视图,但有一些限制。)

我做了一个获取,我的所有数据都存在于记录、键、描述、外键等中。

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

而不是删除工作正常。而不是更新工作正常。

这个错误一直引起人们的注意,而不是插入。我无法让插入触发器成功插入到我的表中。如果我在视图上运行插入,并使用 SQL Management Studio 中提供的所有字段,它工作正常。我知道传递的确切值,因为我运行 SQL Server Profiler 来查看传递的代码。

但是当应用程序尝试更新时,它失败了身份为“ChangeID”的成员在元数据集合中不存在。

上面的线索,有人说,“MVC期望表键是ID

在我看来,我将 ChangeID 重命名为 ID,在 App 中进行了更改,然后 BAM!现在它起作用了。

什么没有奏效:

  • db.Configuration.ValidateOnSaveEnabled = false;
  • 向触发器添加选择以获取范围标识

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

尽管如此,在令人沮丧的两天之后,代码现在可以工作了。也许这也会为其他人节省一些时间。

于 2020-01-31T23:19:28.170 回答
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();               
}
于 2012-05-30T15:46:47.690 回答
0

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

在此处查看更多信息

于 2018-03-23T14:01:57.110 回答
0

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

select @any= any from tablename  

你应该使用 set 而不是 select

set @any= (select any from tablename)
于 2018-11-05T19:10:27.323 回答
-1

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

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

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

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

“元数据集合中不存在身份为'Customization_ColorStyleCustomizations_Source'的成员。参数名称:身份”

这是一个相当错误的信息,不是吗。

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

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

于 2015-11-24T19:08:52.490 回答