我正在尝试在我的项目中实现DDD方法,但是意识到我的聚合总量太大,并试图最小化从数据库加载的数据量。我有一个汇总订单,在某些操作过程中,该订单取决于另一个汇总-公司。要执行操作 RefreshOrderNumber(),我需要Company实体的三个属性,而对** Company的其他字段完全不感兴趣。因此,我想到了为Order- OrderCompanyInfo 创建值类型并将其封装在其中的
public override void Configure(EntityTypeBuilder<Order> builder)
{
builder.OwnsOne(x => x.InventoryOwnsCompanyProfile, opt =>
{
opt.ToTable("Company");
opt.HasOne<Company>()
.WithOne()
.HasForeignKey<OrderCompanyInfo>(x => x.CompanyId);
});
}
现在,我正在尝试使其与EF core一起使用。基本上, OrderCompanyInfo 应该使用 OwnOne()方法进行配置,并映射到与 Company 实体相同的表中,以便在订购期间数据始终是真实的通过存储库汇总加载。因此,我对订单汇总有以下配置:
Cannot use table 'dbo.Company' for entity type 'OrderCompanyInfo ' since it is being used for entity type 'Company' and there is no relationship between their primary keys.
但是尝试这种方式会给我一个错误:
{{1}}
有什么方法可以使EF核心以这种方式工作?
答案 0 :(得分:0)
好的,答案是在GitHub社区上找到的。 https://github.com/dotnet/efcore/issues/13162#issuecomment-417411405
他们提供了一个示例,其中包含两个映射到同一表的实体
namespace One
{
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
}
namespace Two
{
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime Birthday { get; set; }
}
}
public class BloggingContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test;ConnectRetryCount=0");
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<One.Person>(b =>
{
b.HasOne<Two.Person>().WithOne().HasForeignKey<Two.Person>(e => e.Id);
b.ToTable("People");
b.Property(e => e.Name).HasColumnName(nameof(One.Person.Name));
});
builder.Entity<Two.Person>(b =>
{
b.ToTable("People");
b.Property(e => e.Name).HasColumnName(nameof(Two.Person.Name));
});
}
}
我尝试将 OrderCompanyInfo 构建为拥有类型是错误的,因为拥有类型暗示着拥有类型与所有者之间的关系。在我的情况下,这会导致当 Company 表具有 OrderId 字段的情况,至少这是不正确的。通过HasOne()配置OrderCompanyInfo实体非常适合我