使用Entity Framework提交对数据库的更改

时间:2011-10-18 17:34:34

标签: c# asp.net-mvc-3 entity-framework

我有一种情况,我按日期从表中提取数据。如果没有为给定日期提供数据,我使用默认值创建记录并将其全部显示给用户。当用户完成操作数据时,我需要提交更改。

所以我的问题是如何在实体框架中处理提交表格,其中可能存在需要完成的更新和添加。这是在使用MVC3和实体框架的C#中。

所以这里是数据的起点,

表A

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 个答案:

答案 0 :(得分: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();

(我假设NAMETableOBJECT实体的主要关键属性。)

答案 1 :(得分:0)

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

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