我有一种情况,我按日期从表中提取数据。如果没有为给定日期提供数据,我使用默认值创建记录并将其全部显示给用户。当用户完成操作数据时,我需要提交更改。
所以我的问题是如何在实体框架中处理提交表格,其中可能存在需要完成的更新和添加。这是在使用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();
这是否有效或者我是否需要跟踪那里的内容和添加的内容?
想法?
答案 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();
(我假设NAME
是TableOBJECT
实体的主要关键属性。)
答案 1 :(得分:0)
我认为你必须跟踪新内容和修改内容。如果您这样做,那么您提供的两个代码示例将起作用。 我使用的一个简单的解决方法是检查实体的主键属性是否设置为任何东西。如果它被设置为一个值,那么这是一个更新的对象,否则它是新的。
另一种解决方案是使用Entity Framework的自我跟踪实体,但我认为这不是进入Web应用程序的正确方向(可能是在分布式WCF应用程序中)。