我在尝试调试时简化了一些代码:
[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"}
答案 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。
有几种解决方法:
- 使用存储过程插入数据(未测试)
- 删除而不是插入触发器(触发器可能会导致其他问题,因此有些人认为不会使用它们)(已测试,无效!)
- 关闭EF框架中的验证,所以:context.Configuration.ValidateOnSaveEnabled = false(已测试,有效!)
醇>
答案 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!现在可以了。
什么不起作用:
为什么必须修改数据库或视图以满足某些隐藏的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格式指定我的模型。
答案 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"
这是一个非常错误的信息,不是。
两年来,这段代码坐在那里没有丢失任何错误,然后突然有一天,它开始为某些颜色样式产生这个错误。 /抖动。我不明白。但它没有必要,拿出来解决问题,所以。为了防止其他人遇到同样的问题,这就是。
(如果它不清楚 - 在这种情况下,解决方案只是删除代码。)