使用Entity Framework提交更改到数据库

6
我有一个情况,需要按日期从表中获取数据。如果给定日期没有提供数据,则使用默认值创建记录并显示给用户。当用户完成数据操作后,我需要提交更改。
因此,我的问题是,在Entity Framework中如何处理提交表格的情况,其中可能需要进行更新和添加。这是在使用MVC3和Entity Framework的C#中进行的。
以下是数据的初始样子,如下所示:
NAME  AGE PHONE_NUM 
Jim   25  555-555-5555 
Jill  48  555-551-5555

用户完成数据后,它可能会呈现如下形式: 表格A
NAME  AGE PHONE_NUM
Jim   25  555-555-5555
Jill  28  555-551-5555
Rob   42  555-534-6677

我该如何提交这些更改?我的问题是既需要更新又需要插入?

我找到了一些代码,但不确定它是否适用于此情况。

对于添加数据行:

entities.TABlEA.AddObject(TableOBJECT);
entities.SaveChanges();

或用于更新数据

entities.TABLEA.Attach(entities.TABLEA.Single(t => t.NAME == TableOBJECT.NAME));
entities.TABLEA.ApplyCurrentValues(TableOBJECT);
entities.SaveChanges();

这会起作用吗,还是我需要跟踪记录现有内容和新增内容?
你有什么想法?
2个回答

4

基本上,您已经有了解决方案。您只需要检查尝试从数据库加载对象的Single调用是否有结果(请改用SingleOrDefault)。如果结果为null,则需要插入,否则更新:

foreach (var TableOBJECT in collectionOfYourTableOBJECTsTheUserWorkedWith)
{
    var objectInDB = entities.TABLEA
        .SingleOrDefault(t => t.NAME == TableOBJECT.NAME);
    if (objectInDB != null) // UPDATE
        entities.TABLEA.ApplyCurrentValues(TableOBJECT);
    else // INSERT
        entities.TABLEA.AddObject(TableOBJECT);
}
entities.SaveChanges();

(我假设NAME是你的TableOBJECT实体的主键属性。)

1
Single用于检查查询结果是否只有一个。如果没有结果,Single会抛出异常。SingleOrDefault用于检查是否有一个结果,如果查询为空,则返回默认值(大多数情况下为NULL)。因此,在应始终存在一个结果时,请使用Single。而在可能没有任何结果时,请使用SingleOrDefault。 - Wouter de Kort
所以我花了一些时间才能使用它,它非常好,除了当它必须添加多个内容时,我会从数据库中得到一个异常,抱怨没有唯一的键。有什么想法吗? - Dan
@Slauma:这里是异常信息,出现在entities.SaveChanges();上。InvalidOperationException 成功提交了对数据库的更改,但在更新对象上下文时发生错误。ObjectContext 可能处于不一致状态。内部异常消息:AcceptChanges 无法继续,因为对象的键值与 ObjectStateManager 中的另一个对象冲突。在调用 AcceptChanges 之前,请确保键值是唯一的。 - Dan
我研究了一下,这是一个第一次机会异常,据我所知,这意味着它可能会在以后引发异常,但现在没有。因此,我捕获它,忽略它,一切都正常工作。这听起来安全吗?还是我应该真的找出如何停止它? - Dan
@Dan:你可能应该创建一个关于这个问题的新问题,并展示你正在使用的代码。对于自动生成的键,我无法看出这个异常可能来自哪里。 - Slauma
显示剩余4条评论

0

我认为你必须跟踪什么是新的,什么被修改了。如果你这样做,那么你提供的两个代码示例将会起作用。 一个简单的解决方法是检查实体的主键属性是否设置为任何值。如果它设置为一个值,那么它就是一个更新的对象,否则它是新的。

另一个解决方案是使用Entity Framework的自跟踪实体,但我不认为这是在Web应用程序中前进的正确方向(也许在分布式WCF应用程序中是正确的)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接