EF核心3.1-实体和所有类型的公用表

时间:2020-10-12 20:15:17

标签: c# asp.net entity-framework domain-driven-design

我正在尝试在我的项目中实现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核心以这种方式工作?

1 个答案:

答案 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实体非常适合我