假设我有一张桌子联系人:
ContactType
FirstName
LastName
CustomerId
Department
etc...
ContactType是
Buyer
Sales
我可以使用实体框架将其拆分为两个不同的实体吗? 有没有办法注释配置构建器以指定我的Buyer实体具有ContactType = Buyer且我的SalesRep实体具有ContactType = SalesRep?
我已经搜索了一段时间,我已经看到了将表格水平分割的方法,这样我就可以将列分成多个实体,但我还没有找到解决方法从同一个表到不同实体的不同记录。
答案 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 }
}
如果您还希望能够更改Buyers
和SalesReps
,则需要创建一个可以提供完整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();
}