我正在使用EF 5.0进行主数据管理的应用程序,我希望尽可能保持通用,因为加载项目,保存它们等总是一样的。
我的实体看起来像这样:
// IDBEntity.cs
public interface IDBEntity<T>
{
public int ID { get; }
...
}
// Product.cs (Generated)
public class Product
{
public int ProductID
{
get; set;
}
public string Name
{
get; set;
}
}
// ProductExtension.cs
public patial class Product : IDBEntity<Product>
{
public int ID
{
get
{
return ProductID
}
}
}
现在我想在某些情况下对ID进行查询,但问题是您无法使用自定义属性执行LINQ to Entity查询。
public class MasterDataViewModel<T> : where T : IDBEntity, new()
{
public T CurrentItem { get; set; }
public void ReloadItem(int id)
{
using (var context = new DatabaseContext())
{
// This is the problem
CurrentItem = context.Set<T>.FirstOrDefault(x => x.ID == id)
}
}
}
是否可以使用指向真实ID的表达式来执行此操作?像这样:
public interface IDBEntity<T>
{
public Expression<Func<T, int>> { get; }
}
public patial class Product : IDBEntity<Product>
{
public Expression<Func<Product, int>> ID
{
get
{
return x => x.ProductID
}
}
}
这个问题还有其他更好的解决方案吗?
答案 0 :(得分:1)
在同样的情况下,我们使用了这段代码:
public class BaseEntity
{
public int Id { get; set; }
}
所以你的Product
看起来像
public class Product : BaseEntity
{
public string Name { get; set; }
}
MasterDataViewModel
public class MasterDataViewModel<T> : where T : BaseEntity, new()
{
public T CurrentItem { get; set; }
public void ReloadItem(int id)
{
using (var context = new DatabaseContext())
{
CurrentItem = context.Set<T>.FirstOrDefault(x => x.Id == id)
}
}
}
答案 1 :(得分:1)
使用DbSet中的Find方法
public class MasterDataViewModel<T> : where T : IDBEntity, new()
{
public T CurrentItem { get; set; }
public void ReloadItem(int id)
{
using (var context = new DatabaseContext())
{
CurrentItem = context.Set<T>().Find(id);
}
}
}