ASP.NET MVC 3,Code-First EF:OriginalValues?

时间:2012-04-30 02:24:20

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

我的代码似乎很简单:

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,即使它有一个私有的setter而userID作为主键,应该是数据库 - 产生。但是如果 是问题,就不可能简单地使用Add()将对象插入到任何EF数据库中。所以我很困惑。

提前感谢任何能帮助解释这一点的人。

ETA:newUser由我的控制器中的以下代码创建:

[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,用于将数据从Regiostration表单传递给Controller。 userRep是我的用户存储库。

2 个答案:

答案 0 :(得分:0)

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

bool addSuccess = userRep.Add(newUser);

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

然后(给定passUserName是从上面传递的名称)将您的linq查询更改为:

var results = from user in Users
        where user.userName.Equals(passedUserName)
        select user;
祝你好运!

答案 1 :(得分:0)

尽可能确定,问题似乎源于对对象的“深层”引用或对引用的引用。 IOW,Foo类引用了类Bar,它引用了类Baz,引用了类Foo ......显然EF并不喜欢这么多,因为它不容易验证。