【发布时间】:2018-02-21 10:06:27
【问题描述】:
我正在使用在 webapi 请求上执行所有操作后调用 dbcontext.SaveChanges 的工作单元模式。在请求的一部分中,我向 dbcontext 添加了一个新客户。
dbContext.Customers.Add(new Customer());
在请求的后期(通常在域事件处理程序内部),我使用相同的 dbcontext 将客户拉回。
_dbContext.Customers.FirstOrDefault(x => x.Id == id);
public abstract class Customer
{
public Customer()
{
Id = Guid.NewGuid();
}
}
我已验证 dbContext.Customers.Local 具有我所期望的对象,但它似乎并未提取本地对象。这可能是因为 Customer 是一个抽象类,由 DirectCustomer 和 InDirectCustomer 实现吗?
为什么?我可以通过配置更改此行为吗?也许我必须合并本地和数据库结果(有点 hacky)。
更新:
class Program
{
static void Main(string[] args)
{
MyDbContext context = new MyDbContext();
Guid customerGuid = Guid.NewGuid();
context.Customers.Add(new DirectCustomer()
{
Id = customerGuid
});
// This does not work, customerFromLocal1 is null
var customerFromLocal1 = context.Customers.FirstOrDefault(x => x.Id == customerGuid);
// This does work, customerFromLocal2 is NOT null
var customerFromLocal2 = context.Customers.Find(customerGuid);
}
}
public class MyDbContext : Microsoft.EntityFrameworkCore.DbContext
{
public DbSet<Customer> Customers { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("server=.\\sqlexpress;integrated security=true;database=EFCoreDeepDive2");
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<DirectCustomer>();
builder.Entity<IndirectCustomer>();
}
}
public abstract class Customer
{
public Guid Id { get; set; }
}
public class DirectCustomer : Customer
{
}
public class IndirectCustomer : Customer
{
public Guid ParentCustomerId { get; set; }
}
【问题讨论】:
-
Customer的定义是怎样的,id是从哪里来的?我目前的怀疑是 EF 可能被设置为自动生成Customer.Id,但如果是这种情况,在您保存更改之前它不会这样做。 -
@SamIam 不,它是在构造函数中生成的。本地集合中客户的 ID 也与我正在查询的 ID 匹配。
-
FirstOrDefault 将始终执行数据库查询以查找实体。如果您想先查看本地,请考虑使用
Find。 -
但它似乎没有提取本地对象我不太明白你的意思。此外,查看显示发生情况而不是描述的代码会有所帮助。很难修复不可见的代码。
-
@Smit 我认为您需要将您的评论转换为答案。请参阅带有人为示例的更新问题