0

我有一个我正在尝试使用 MVC(2) 更新的对象,也使用 EntityFramework 框架。

我知道我没有提供太多代码,但我真的觉得没有必要。我有这样的逻辑的原因,我会解释:

  • 我有一些级联下拉菜单,当其中一个下拉菜单为空时,我使用 jQuery 为其填充“未知”值,例如 id 为 -1。
  • 因此,当我得到值 -1 时,我创建了另一个表中的 UNKNOWN 值。
  • 然后我找到那个对象并将它分配给Fruit

像这样的代码:

if (id == -1)
            {
                //The object was unknown so create it
                var newUnknown = new Fruit
                                 {
Name = "UNKNOWN";
};

EntityFramework.AddToFruits(newUnknown);
EntityFramework.SaveChanges();
defaultValueObject = EntityFramework.Fruits.Single(x=>x.FruitID == newUnknown.FruitID);

object.Fruit = defaultValueObject;
object.Date = DateTime.Now;

UpdateModel(object);
EntityFramework.SaveChanges();

运行 line后UpdateModel(object);,我设置的值,例如,Fruit恢复为从表单发送过来的值...(即 -1),然后EntityFramework.SaveChanges();FK contrainst 失败(因为不存在 id 为 -1 的水果)!很公平——但这不是我分配给你的!

我不明白为什么它会恢复,因为在第一个AddToFruits()未知数在数据库中之后......一直到UpdateModel(object);它在object......

如果它像我分配的那样添加它,则不会出现 FK 约束异常。但是 MVC 的 UpdateModel 决定做一些奇怪的事情并默认为(可能是表单提交时出现的)并将其搞砸了。

为什么会这样?我该如何解决?

4

2 回答 2

2

UpdateModel 没有做任何奇怪的事情,它正在做它应该做的事情;使用表单提交中的值更新对象。

EF 正在跟踪更改,因此它会尝试使用对象在保存时的值来更新 db 值。

通过在运行 UpdateModel 后进行更改来解决它。

于 2011-06-10T05:45:37.397 回答
1

您可以将字符串数组传递给 UpdateModel 以告诉它要在模型中更新哪些属性。

public class Fruit
{
    int ID { get; set; }
    bool IsTasty { get; set; }
    string MyOtherPropert { get; set; }
    DateTime Date { get; set; }
}

...

if (id == -1)
{
    //The object was unknown so create it
    var newUnknown = new Fruit
    {
        Name = "UNKNOWN"
    };
    EntityFramework.AddToFruits (newUnknown);
    EntityFramework.SaveChanges ();

    defaultValueObject = EntityFramework.Fruits.Single (x=>x.FruitID == newUnknown.FruitID);
    defaultValueObject.Date = DateTime.Now;

    UpdateModel (object, new string[] { "IsTasty", "MyOtherProperty" });

    EntityFramework.SaveChanges ();
}

这样做将确保您想要更新的所有属性都将被更新,并且您想要单独留下的那些将不会被触及。在这种情况下,ID 和 Date 将被 UpdateModel 忽略。

于 2011-06-10T05:55:18.763 回答