我在尝试调试时简化了一些代码:
[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"}
问题是由于用户表上的触发器而重现。删除它,问题不再复制。
当我尝试使用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
的数据库时,您将得到上述错误。
我希望这有帮助,谢谢
表上可能有一个触发器正在更新并返回输出。输出被丢弃,但它与EF冲突。这种输出通常用于调试触发器(以后忘记删除):
select 'trigger called, i am here'
或者可能缺少变量:
select column
代替
select @variable=column
我认为最好的解决方案是在this帖子。我使用了第3个选项并且有效。在这里,我在链接中报告回复:
该问题可能与您的某个表上的“而不是插入”触发器有关。
EF框架通过调用scope_identity()对插入的数据行执行验证。但是,“而不是插入”触发器将以这样的方式更改插入的上下文,即EF系统对scope_identity的调用将返回null。
有几种方法:
- 使用存储过程插入数据(未测试)
- 删除而不是插入触发器(触发器可能会导致其他问题,所以有些人认为不使用它们)(测试,工作!)
- 关闭EF框架中的验证,所以:context.Configuration.ValidateOnSaveEnabled = false(已测试,有效!)
我今天也遇到了同样的错误,花了几个小时才想弄清楚。
我使用Entity Framework将带有标识列的记录插入到SQL Server数据库表中。很简单。
该表上有一个触发器,它依次运行存储过程。存储过程中有一行:
select newid()
这是破坏实体框架的一条线。
对于具有标识列的表,实体框架期望返回一行,其中一个字段是标识列。
试试这个
[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();
}
我有这个问题和我的修复,是在我的连接字符串元数据中我没有以.msl格式指定我的模型。
这是因为如果使用触发器,触发器会将值传回EF。在我的问题中,我必须通过从其他表中选择并在EF中使用'select'导致错误来检查值,因此您必须将'select'替换为'set'。你不能使用这个代码。
select @any= any from tablename
你应该使用set而不是select
set @any= (select any from tablename)
这是Google在我搜索产生此错误消息的问题版本的解释时返回的第一页,因此我将在此处提及,以及解决方案对我而言。
在我的问题版本中,违规代码如下所示:
foreach (var comp in colorstyle.Companions)
comp.LinkCS = db.ColorStyles.Find(comp.LinkColorStyleId);
我继承了维护和支持具有此代码的应用程序的工作。此代码将导航属性设置为已经相关的实体,使用相同对象的关联外键属性作为查找。这完全是不必要的,有时似乎......并不总是..产生这个错误:
“具有标识'Customization_ColorStyleCustomizations_Source'的成员在元数据集合中不存在。参数名称:identity”
那是一个非常错误的信息,不是吗。
两年来,这段代码坐在那里没有丢失任何错误,然后突然有一天,它开始为某些颜色样式产生这个错误。 /抖动。我不明白。但这没有必要,并且解决问题也是如此。为了防止其他人遇到同样的问题,这里就是这样。
(如果不清楚 - 在这种情况下,解决方案只是删除代码。)