实体框架具有多个鉴别器的多重继承

时间:2017-10-28 21:40:41

标签: entity-framework inheritance

我想要实现这样的结构:

public enum TreeType {
    Product = 1,
    User = 2,
    Document = 3        
}

public enum ProductType {
    Service = 1,
    Ware = 2
}

public enum DocumentType {
    Order = 1,
    Invoice = 2
}

public abstract class Tree
{
    [Key]
    public Guid Id { get; set; }

    [Required]
    public string Name { get; set; }

    [NotMapped]
    public TreeType Type { get; set; }
}

public abstract class Product : Tree
{
    [Required]
    public string Article { get; set; }

    [NotMapped]
    public ProductType ProductType { get; set; }

    public Tree 
    {
        this.Type = TreeType.Product;
    }
}

public class User : Tree
{
    [Required]
    public string Login { get; set; }

    [Required]
    public string Password { get; set; }

    public User 
    {
        this.Type = TreeType.User;
    }
}

public abstract class Document : Tree
{
    [Required]
    public int PageCount { get; set; }

    [Required]
    public DateTime Created { get; set; }

    [NotMapped]
    public DocumentType DocumentType { get; set; }

    public Document 
    {
        this.Type = TreeType.Document;
    }
}

public class Service : Product
{
    [Required]
    public int VisitCount { get; set; }

    public Service 
    {
        this.ProductType = ProductType.Service;
    }
}

public class Ware : Product
{
    [Required]
    public string StorageName { get; set; }

    public Ware 
    {
        this.ProductType = ProductType.Ware;
    }
}

public class Order : Document
{
    [Required]
    public string CustomerName { get; set; }

    public Order 
    {
        this.DocumentType = DocumentType.Order;
    }
}

public class Invoice : Document
{
    [Required]
    public string SupplierName { get; set; }

    public Invoice 
    {
        this.DocumentType = DocumentType.Invoice;
    }
}

public class TreeDbContext : DbContext
{
    DbSet<Tree> Trees { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Tree>().ToTable("L_TREES");
            .Map<Product>(x => x.Requires("Type").HasValue((int)TreeType.Product)).ToTable("L_PRODUCTS");
            .Map<User>(x => x.Requires("Type").HasValue((int)TreeType.User)).ToTable("L_USERS");
            .Map<Document>(x => x.Requires("Type").HasValue((int)TreeType.Document)).ToTable("L_DOCUMENTS");

        modelBuilder.Entity<Product>()
            .Map<Service>(x => x.Requires("ProductType").HasValue((int)ProductType.Service)).ToTable("L_SERVICES");
            .Map<Ware>(x => x.Requires("ProductType").HasValue((int)ProductType.Ware)).ToTable("L_WARES");

        modelBuilder.Entity<Document>()
            .Map<Order>(x => x.Requires("ProductType").HasValue((int)DocumentType.Order)).ToTable("L_ORDERS");
            .Map<Invoice>(x => x.Requires("ProductType").HasValue((int)DocumentType.Invoice)).ToTable("L_INVOICES");    
    }
}

在数据库中它看起来像这样: enter image description here

两级继承我可以通过TPH和TPT实现,但是多级继承,甚至有几个描述符,我都无法实现。

作为退出,我可以使用继承和组合,但实现很麻烦,并且需要很多手动操作来支持将来。

我尝试实现这种架构,但我没有成功。

有谁知道我该怎么做?

0 个答案:

没有答案