如何在ADO.NET实体框架中向实体添加项目

时间:2012-04-06 15:23:37

标签: entity-framework ado.net

我正在使用 ADO.NET实体框架在C#中开发应用程序。

在网络上的许多示例中,我看到为了向实体添加元素newProduct,我们假设Product,使用以下代码:

context.Products.Add(newProduct);

方法添加,但是,它不是Products的成员,因此我无法使用它。也许示例中使用的EF是LinqToSQL。

但是在ADO.NET中有一个方法AddObject

context.AddObject("Products", newProduct)

它有效,但我不喜欢它有两个原因:

1)我尽量避免 魔术字符串,除非他们真的是实现功能的唯一手段

2)它提供 void 作为返回类型,如何检查插入是否良好?

我相信还有另一种插入我的实体的方法。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

  

1)我尽量避免使用魔法弦,除非它们是   真的是实现功能的唯一手段

如果contextObjectContext(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(...)很可能是contextDbContext(EF> = 4.1)的示例。 DbContext是实体框架的简化API(它仍然使用核心ObjectContext)。在此API中,插入新实体的方法确实称为AddDbSet<T>的方法),而不是AddObject