我有一个对象,我正在尝试使用MVC(2)更新,也使用EntityFramework框架。
我知道我没有提供太多代码,但并不觉得有必要。我有这样的逻辑的原因,我会解释:
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();
运行UpdateModel(object);
行后,我设置的值(例如Fruit
)将恢复为从表单发送的内容...(即-1)然后{{1 FK反对失败(因为id为-1的水果不存在)!很公平 - 但那不是我给你的!
我不明白为什么它会恢复,因为在第一个EntityFramework.SaveChanges();
未知数据库中的数据库正常......并且所有直到AddToFruits()
它都在UpdateModel(object);
中。
如果它像我指定的那样添加它,就不会有FK约束异常。但是MVC的UpdateModel决定做一些奇怪的事情并默认(也许是表单提交时提出的)并搞砸了。
为什么会这样?我该如何解决?
答案 0 :(得分:2)
UpdateModel没有做任何奇怪的事情,它正在做它应该做的事情;使用表单提交中的值更新对象。
EF正在跟踪更改,因此它会尝试使用保存时对象的内容更新db值。
在运行UpdateModel后进行更改来解决此问题。
答案 1 :(得分: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 ();
}
执行此操作将确保您想要更新的所有属性都将被删除,并且不会触及您想要保留的属性。在这种情况下,UpdateModel将忽略ID和Date。