我正在使用 ADO.NET实体框架在C#中开发应用程序。
在网络上的许多示例中,我看到为了向实体添加元素newProduct
,我们假设Product
,使用以下代码:
context.Products.Add(newProduct);
方法添加,但是,它不是Products
的成员,因此我无法使用它。也许示例中使用的EF是LinqToSQL。
但是在ADO.NET中有一个方法AddObject
:
context.AddObject("Products", newProduct)
它有效,但我不喜欢它有两个原因:
1)我尽量避免 魔术字符串,除非他们真的是实现功能的唯一手段
2)它提供 void 作为返回类型,如何检查插入是否良好?
我相信还有另一种插入我的实体的方法。有人可以帮忙吗?
答案 0 :(得分:4)
1)我尽量避免使用魔法弦,除非它们是 真的是实现功能的唯一手段
如果context
是ObjectContext
(EF <= 4.0),您通常应该在派生的上下文中有一个成员,该成员代表ObjectSet<Product>
,其名称为Products
或类似的。你可以使用:
context.Products.AddObject(newProduct);
即使您的上下文中没有这样的集合,也有另一种强类型选项:
context.CreateObjectSet<Product>().AddObject(newProduct);
2)它给出了返回类型的void,如何检查是否插入 是好还是不好?
AddObject
根本不会将INSERT打包到数据库中。它只将对象置于objectContext中的Added
状态。当您调用SaveChanges
时,真正的INSERT会在单个事务中稍后发生。
尽管如此,AddObject
可能会失败,例如,如果您将具有相同密钥的两个对象添加到上下文中(如果您的实体没有密钥的自动生成标识),或者出于其他原因。如果是这样,AddObject
将抛出一个您不应该捕获的异常,因为它通常表示代码中存在严重问题或错误。
SaveChanges
会返回int
。但是这个int
并不表示SaveChanges
并且插入您的对象是成功的。它只计算Added
状态(将导致INSERT语句),Modified
状态(将导致UPDATE语句)和Deleted
状态(将导致DELETE语句)的数字对象在SQL语句获得优先权之前的对象上下文。
同样,如果任何SQL语句(如您的INSERT)不成功,SaveChanges
将抛出异常。该异常可以指示客户端已经存在问题,或者它可以告诉您SQL操作期间出现问题 - 例如:对于INSERT失败,异常可能会给您一条消息,说明INSERT失败,因为已经有一行带有密钥您希望在数据库中插入,或者您要插入的实体中没有填充所需的非可空列等。此外,许多其他异常类型也可能导致并发问题。
您可以通过捕获可能的例外来检查SaveChanges
是否成功:
try
{
int numberOfObjects = context.SaveChanges();
}
catch (SomeExceptionType e)
{
// What now?
}
BTW:您看到的context.Products.Add(...)
很可能是context
为DbContext
(EF> = 4.1)的示例。 DbContext
是实体框架的简化API(它仍然使用核心ObjectContext
)。在此API中,插入新实体的方法确实称为Add
(DbSet<T>
的方法),而不是AddObject
。