使用实体框架向数据库提交更改
本文关键字:提交 数据库 实体 框架 | 更新日期: 2023-09-27 18:11:41
我有一种情况,我从一个表中按日期提取数据。如果没有提供给定日期的数据,我将使用默认值创建一条记录,并将其全部显示给用户。当用户完成对数据的操作后,我需要提交更改。
所以我的问题是我如何处理在实体框架提交一个表,其中可能有更新和添加需要做的。这是在c#中使用mvc和实体框架。
这是数据开始的样子,
表NAME AGE PHONE_NUM
Jim 25 555-555-5555
Jill 48 555-551-5555
用户处理完数据后,它看起来像这样,
表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();
将任何这工作或我需要保持跟踪有什么和什么添加?
想法?
或多或少你已经有了解决方案。你只需要检查你的Single
调用是否试图从DB加载对象有结果或没有(使用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
实体的主键属性。)
我认为你必须跟踪哪些是新的,哪些是修改的。如果您这样做了,那么您提供的两个代码示例就可以工作了。我使用的一个简单的解决方法是检查实体的主键属性是否设置为任何东西。如果它被设置为一个值,那么它是一个更新的对象,否则它是新的。
另一个解决方案是使用实体框架的自我跟踪实体,但我不认为这是正确的方向去一个web应用程序(也许它是在一个分布式的WCF应用程序)。