我有一个Entity Framework 5 Code First DbContext
public class ProductContext : DbContext
{
public DbSet<Product> Products {get;set;}
}
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
}
现在我必须实现一个接口,但不想污染我的模型,所以我创建了一个
public class ProductEx : Product, ISomeInterface
{
public bool ISomeInterface.SomeMethod() { return false; }
}
我知道我能做到:
var query = from p in context.Products
select new ProductEx { p.ProductId, p.Name };
但是由于DbContext已经返回动态代理(因为更改跟踪/延迟加载),可能有更好的方法。我在考虑这样的事情:
var query = from p in context.Products.As<ProductEx>()
select p;
实体应该是从ProductEx继承的动态代理。
有没有办法实现这个目标?
答案 0 :(得分:0)
一种方法是你可以为产品创建一个包装器:
public class Product
{
public virtual int ProductId { get; set; }
public virtual string Name { get; set; }
}
public class ProductEx : Product, ISomeInterface
{
private readonly Product _product;
public ProductEx(Product product) {
this._product = product;
}
public bool ISomeInterface.SomeMethod() { return false; }
public override int ProductId
{
get { return this._product.ProductId; }
set { this._product.ProductId = value; }
}
public override string Name
{
get { return this._product.Name; }
set { this._product.Name = value; }
}
}
然后你可以查询liko:
var query = from p in context.Products
select new ProductEx(p);