DbContext.Add() 和 DbContext.DbSetTEntity.Add(TEntity) 之间有什么区别你什么时候使用其中一种

作者:编程家 分类: 编程代码 时间:2025-10-08

DbContext.Add() 和 DbContext.DbSet.Add(TEntity) 的区别及使用场景

在Entity Framework Core中,我们可以使用DbContext.Add()方法或者DbContext.DbSet.Add(TEntity)方法将实体对象添加到数据库上下文中。这两种方法在实现上有一些区别,并且适用于不同的场景。

DbContext.Add() 方法

DbContext.Add()方法是DbContext类的一个实例方法,它可以根据实体对象的类型自动匹配相应的DbSet属性,并将实体对象添加到对应的DbSet中。这个方法的语法如下:

csharp

public virtual EntityEntry Add(object entity);

使用DbContext.Add()方法时,我们只需要将要添加的实体对象作为参数传递给该方法即可。例如,我们有一个名为"Product"的实体类,我们可以这样使用DbContext.Add()方法将一个Product对象添加到数据库上下文:

csharp

Product product = new Product { Name = "Apple", Price = 1.99 };

context.Add(product);

DbContext.DbSet.Add(TEntity) 方法

DbContext.DbSet.Add(TEntity)方法是DbSet类的一个实例方法,它用于将指定的实体对象添加到相应的DbSet中。这个方法的语法如下:

csharp

public virtual EntityEntry Add(TEntity entity);

使用DbContext.DbSet.Add(TEntity)方法时,我们需要先获取要添加的实体对象所对应的DbSet对象,然后调用该方法将实体对象添加到数据库上下文。例如,我们有一个名为"Product"的实体类,我们可以这样使用DbContext.DbSet.Add(TEntity)方法将一个Product对象添加到数据库上下文:

csharp

Product product = new Product { Name = "Apple", Price = 1.99 };

context.Products.Add(product);

使用场景

在大多数情况下,我们可以选择使用DbContext.Add()方法或者DbContext.DbSet.Add(TEntity)方法来添加实体对象到数据库上下文。然而,有一些场景下更适合使用其中一种方法。

当数据库上下文中只有一个DbSet属性时,使用DbContext.Add()方法更加方便。

如果我们的数据库上下文只包含一个DbSet属性,或者我们不想在代码中直接引用DbSet属性,那么使用DbContext.Add()方法会更加方便和简洁。这样我们只需要将实体对象作为参数传递给DbContext.Add()方法,而不需要先获取对应的DbSet对象。

当数据库上下文中有多个DbSet属性且需要显式指定要添加的实体对象时,使用DbContext.DbSet.Add(TEntity)方法更合适。

如果我们的数据库上下文包含多个DbSet属性,并且我们希望显式指定要将实体对象添加到哪个DbSet中,那么使用DbContext.DbSet.Add(TEntity)方法会更加合适。这样我们需要先获取对应的DbSet对象,然后调用Add()方法将实体对象添加到指定的DbSet中。

代码示例

下面是一个简单的代码示例,演示了如何使用DbContext.Add()方法和DbContext.DbSet.Add(TEntity)方法将实体对象添加到数据库上下文中:

csharp

using System;

using Microsoft.EntityFrameworkCore;

namespace EFCoreExample

{

public class Product

{

public int Id { get; set; }

public string Name { get; set; }

public decimal Price { get; set; }

}

public class AppDbContext : DbContext

{

public DbSet Products { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

{

optionsBuilder.UseSqlServer("your_connection_string");

}

}

public class Program

{

public static void Main(string[] args)

{

using (var context = new AppDbContext())

{

// 使用DbContext.Add()方法将实体对象添加到数据库上下文

Product product1 = new Product { Name = "Apple", Price = 1.99 };

context.Add(product1);

// 使用DbContext.DbSet.Add(TEntity)方法将实体对象添加到数据库上下文

DbSet products = context.Set();

Product product2 = new Product { Name = "Orange", Price = 2.99 };

products.Add(product2);

context.SaveChanges();

}

}

}

}

在上面的示例中,我们创建了一个简单的实体类Product和一个继承自DbContext的数据库上下文类AppDbContext。在Main()方法中,我们分别使用DbContext.Add()方法和DbContext.DbSet.Add(TEntity)方法将两个Product对象添加到数据库上下文中,并最终调用SaveChanges()方法将实体对象保存到数据库中。

在Entity Framework Core中,DbContext.Add()方法和DbContext.DbSet.Add(TEntity)方法都用于将实体对象添加到数据库上下文中。根据不同的使用场景,我们可以选择使用其中一种方法。如果数据库上下文中只有一个DbSet属性或者我们不想在代码中直接引用DbSet属性,那么使用DbContext.Add()方法更加方便。如果数据库上下文中有多个DbSet属性且需要显式指定要添加的实体对象,那么使用DbContext.DbSet.Add(TEntity)方法更为合适。