【问题标题】:ASP.NET MVC 3, Code-First EF: OriginalValues?ASP.NET MVC 3,代码优先 EF:OriginalValues?
【发布时间】:2012-04-30 02:24:19
【问题描述】:

我的代码看起来很简单:

bool rv = false;
var results = from user in Users
            where user.userName.Equals(newUser.userName)
            select user;
if (results.Count() == 0)
{
    this.context.Users.Add(newUser);
    this.context.SaveChanges();
    rv = true;
}
return rv;

但这会导致 DbEntityValidationException 带有一个内部异常值: OriginalValues cannot be used for entities in the Added state.

...这是什么意思?我唯一能想到的是newUser 显示userID 的值为0,即使它有一个私有设置器并且userID 作为主键应该是数据库生成的。但如果 是问题所在,就不可能简单地使用 Add() 将对象插入任何 EF 数据库。所以我很困惑。

提前感谢任何可以帮助阐明这一点的人。

ETA:newUser 由我的 Controller 中的以下代码创建:

[HttpPost]
public ActionResult CreateRegistration(FormVMRegistration newRegistration)
{
    //draw info from form and add a new user to repository
    User newUser = new User();
    newUser.userName = newRegistration.userName;
    newUser.screenName = newRegistration.screenName;
    newUser.password = newRegistration.usersPW;

    bool addSuccess = userRep.Add(newUser);
    ...
}

FormVMRegistration 只是一个只有字符串属性的 ViewModel,用于将数据从注册表单传送到控制器。 userRep 是我的用户存储库。

【问题讨论】:

  • UserId 不应该真的有一个私有设置器,因为 EF 会尝试在保存时将其值放入此属性中。这应该是公开的
  • 在此之前创建 newUser 的代码是什么?
  • @Luke:我在效仿 Freeman 和 Sanderson 的例子,但我将其更改为 public,但仍然遇到同样的异常。
  • @emragins,我将使用我的控制器中创建newUser 的代码来编辑我的帖子。
  • 先试试这段代码,你用的是EF 4.1还是更高版本?我已经成功尝试过了,它正在工作blogs.msdn.com/b/adonet/archive/2011/03/15/…

标签: c# asp.net-mvc-3 ef-code-first


【解决方案1】:

我认为这是因为您在保存之前使用了 newUser 对象。尝试更改此行

bool addSuccess = userRep.Add(newUser);

bool addSuccess = userRep.Add(newUser, newRegistration.userName);

然后(假设passedUserName 是上面传递的名称)将您的linq 查询更改为:

var results = from user in Users
        where user.userName.Equals(passedUserName)
        select user;

祝你好运!

【讨论】:

  • 您好 veblock,感谢您的建议!它没有用。 :(我重构了User,所以构造函数将newRegistration作为参数。这样我的存储库可以通过调用this.context.Users.Add(new User(newRegistration));来添加
【解决方案2】:

尽可能确定,问题似乎源于对对象的“深度”引用或对引用的引用。 IOW,Foo 类引用了 Bar 类,而 Bar 类又引用了 Baz 类,而 Baz 类又引用了 Foo 类……显然 EF 不太喜欢这个,因为它不容易验证。

【讨论】:

    猜你喜欢
    • 2012-02-11
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多