C# 实体框架不';不要应用更改
我和EF合作了将近一年,突然它停止了更新关于更新实体的数据库。 我怀疑这是因为将EF版本更改为较新的版本(6.1),但后来我回过头来,没有比这更好的了 下面是我遇到的问题的代码示例:C# 实体框架不';不要应用更改,c#,entity-framework,C#,Entity Framework,我和EF合作了将近一年,突然它停止了更新关于更新实体的数据库。 我怀疑这是因为将EF版本更改为较新的版本(6.1),但后来我回过头来,没有比这更好的了 下面是我遇到的问题的代码示例: using(ContextClass db = new ContextClass()) { var order = db.Orders.FirstOrDefault(x => x.RecNo == 584667); order.primaryStatus = "Closed"; ord
using(ContextClass db = new ContextClass())
{
var order = db.Orders.FirstOrDefault(x => x.RecNo == 584667);
order.primaryStatus = "Closed";
order.secondaryStatus = "Closed";
db.Orders.Attach(order);
db.Entry(order).State = EntityState.Modified;
db.SaveChanges();
}
然后运行这段代码,从日志中我可以看到以下图片:
UPDATE [dbo].[Orders]
SET [ID] = @0, [OrderNo] = @1, [ProdLine] = @2, [ProdPos] = @3,
(and here comes every single field EXCEPT those, which I'm trying to modify!)
WHERE ([RecNo] = @20)
SELECT [RecTime], [RecStatus], [OrderStatus], [MPAStatus]
FROM [dbo].[Orders]
WHERE @@ROWCOUNT > 0 AND [RecNo] = @20
-- @0: 'Module-1' (Type = String, Size = 50)
-- @1: 'L1' (Type = String, Size = 50)
-- @2: 'Line2' (Type = String, Size = 50)
-- @3: 'Pos3' (Type = String, Size = 50)
--
-- @20: '584667' (Type = Int64)
同样的问题也适用于我项目中的每个地方,我只是尝试更新数据库,而不管我尝试使用哪种方法。
整个实体,按属性,不重要
你能告诉我问题的根源吗?天哪,
就在我发布了这个问题之后,我找到了答案,答案很明显。
由于某种原因,我在将模型中的StoreGeneratedPattern属性指定为“computed”时没有注意到。
通过这样做,我希望我只是抑制每次填充此字段的要求,因为它不允许为null,并在数据库端获得一个默认值,但我不排除在这种情况下,我将无法在之后手动更改它。
我保留我的问题。也许它能更快地解决一些人的问题。你能给我们看一下
Order
类的代码吗?可能primaryStatus
和secondaryStatus
缺少public
修饰符,或者它们是字段,而不是属性,……另外,为什么要显式调用Attach和set State?如果使用fluent映射,请同时显示映射代码,或者,如果在发布模型代码时使用属性,则包含模型注释。就像@marsze所说的,如果实体对象已经附加到上下文中,您不需要执行另一个附加或设置状态,因为您刚刚检索到它。是的,您是对的。非常感谢。我不知道在我们检索实体后,它可以自由更改,而无需执行额外的执行。