【问题标题】:How to add items to an entity in the ADO.NET Entity Framework如何在 ADO.NET Entity Framework 中向实体添加项
【发布时间】:2012-04-20 04:37:32
【问题描述】:

我正在使用 ADO.NET Entity Framework 在 C# 中开发应用程序。

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

context.Products.Add(newProduct);

方法 Add,但是,它不是 Products 的成员,所以我不能使用它。也许示例中使用的 EF 是 LinqToSQL。

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

context.AddObject("Products", newProduct)

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

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

2) 它以 void 作为返回类型,如何检查插入是否正确?

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

【问题讨论】:

    标签: entity-framework ado.net


    【解决方案1】:

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

    如果contextObjectContext (EF 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 和插入你的对象是成功的。它只计算 SQL 之前的对象上下文中处于Added 状态(将导致 INSERT 语句)、Modified 状态(将导致 UPDATE 语句)和Deleted 状态(将导致 DELETE 语句)的对象数语句被执行。

    同样,如果任何 SQL 语句(如您的 INSERT)不成功,SaveChanges 将抛出异常。异常可能表明客户端已经存在问题,或者它可以告诉您在 SQL 操作期间发生了问题 - 例如:对于失败的 INSERT,异常可能会给您一条消息,指出 INSERT 失败,因为已经有一行具有键您想在数据库中插入,或者您要插入的实体中未填写所需的不可为空的列等。此外,在许多其他异常类型中也可能出现由于并发问题引起的异常。

    您可以通过捕获可能的异常来检查SaveChanges 是否成功:

    try
    {
        int numberOfObjects = context.SaveChanges();
    }
    catch (SomeExceptionType e)
    {
        // What now?
    }
    

    顺便说一句:您看到的context.Products.Add(...) 很可能是contextDbContext (EF >= 4.1) 的示例。 DbContext 是实体框架的简化 API(它仍然使用核心 ObjectContext 在幕后)。在此 API 中,插入新实体的方法确实称为 AddDbSet&lt;T&gt; 的方法)而不是 AddObject

    【讨论】:

    • 好吧,我能说什么......这是一个地狱般的答案。非常感谢您的宝贵时间
    猜你喜欢
    • 2010-10-07
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多