可以根据实体框架中的类型列将表拆分为多个实体吗?

时间:2018-06-14 06:40:19

标签: entity-framework

假设我有一张桌子联系人:

ContactType
FirstName
LastName
CustomerId
Department
etc...

ContactType是

Buyer
Sales

我可以使用实体框架将其拆分为两个不同的实体吗? 有没有办法注释配置构建器以指定我的Buyer实体具有ContactType = Buyer且我的SalesRep实体具有ContactType = SalesRep?

我已经搜索了一段时间,我已经看到了将表格水平分割的方法,这样我就可以将列分成多个实体,但我还没有找到解决方法从同一个表到不同实体的不同记录。

1 个答案:

答案 0 :(得分:1)

我假设您不想更改原始数据库表。您想要为DbContext添加功能,就像您有DbSet和DbSet

一样

您希望使用配置构建器执行此操作。另一种方法是为DbContext添加功能。

应添加哪些功能取决于您对买家和SalesReps的要求。您是否只想执行查询,或者您是否希望能够更改内部将更改您的联系人表格的买方?

仅查询

class MyDbContext : DbContext
{
    public DbSet<Contact> Contacts {get; set;}

    public IQueryable<Buyer> Buyers
    {
        get
        {
             return this.Contacts.Select(contact => new Buyer()
             {
                  // fill all buyer properties:
                  Id = contact.Id,
                  FirstName = contact.FirstName,
                  ...
             };
        }
    }

    public IQueryable<SalesRep> SalesReps { ... similar to Buyers }
}

更改值

如果您还希望能够更改BuyersSalesReps,则需要创建一个可以提供完整IDbSet功能的类,并为您添加一个Getter DbContext

(忽略输入参数检查)

class DbSetBuyer : IDbSet<Buyer>
{
     public DbSetBuyer(MyDbContext dbContext)
     {
         this.owningContext = dbContext;
     }
     private readonly MyDbContext owningContext;

     public Buyer Add(Buyer buyer)
     {
          this.owningContext.Add(new Contact()
          {
               ContactType = ContactType.Buyer,
               FirstName = buyer.FirstName,
               ...
          }
     }
     public Buyer Remove (Buyer buyer)
     {
          Contact contactToRemove = this.owningContext.Contacts.Find(buyer.Id);
          if (contactToRemove != null
              this.owningContext.Contacts.Remove(contactToRemove);
     }
}

因此,对于每个IDbSet函数,您都可以创建一些可以获取/设置/删除的函数 在将买家转换为联系人时,MyDbContext的正确联系人 反之亦然。

class MyDbContext : DbContext
{
    public MyDbContext(...) : DbContext(...)
    {
        this.Buyers = new DbSetBuyers(this);
        this.SalesReps = new DbSetSalesReps(this);
    }

    public DbSet<Contact> Contacts {get; set;}
    public IDbSet<Buyer> Buyers {get; private set;}
    public IDbset<SalesRep> SalesReps {get; private set;}
}

您的DbContext用户不会看到原始DbSet与您的买家和SalesReps之间的区别:

using (var myDbContext = new MyDbContext(...))
{
    var buyerToChange = myDbContext.Buyers
        .Where(buyer => ...)
        .Orderby(buyer => ...)
        .FirstOrDefault();
     if (buyerToChange != null)
     {
         buyerToChange.Department = ...;
     }
     dbContext.SaveChanges();
}