Yuc*_*uck 57 c# generics entity-framework-4.1
我正在寻找一种通用的方法来检查一个实体DbSet.像这样的东西,这是行不通的:
private DbContext DbContext { get; set; }
private DbSet<T> DbSet { get; set; }
public Boolean Exists(T entity) {
return ((from item in this.DbSet
where item == entity
select item).Count() > 0);
}
Run Code Online (Sandbox Code Playgroud)
该行where item == entity适用于LINQ to SQL,但显然不适用于LINQ to Entities.由于实体可能具有不同的密钥,因此我们不能将它们全部继承自具有已知密钥的公共抽象以进行比较.
我可以做到这一点,但我担心将异常作为验证过程的表现这也不起作用,因为只要实体被分离,OriginalValues就无法获得属性:
public Boolean Exists(T entity) {
try {
var current = this.DbContext.Entry(entity).OriginalValues;
// Won't reach this line if the entity isn't in the database yet
return true;
}
catch (Exception ex) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
Lad*_*nka 85
如果实体存在,您是否需要通用方法来检查实体是否按上下文或通用方式加载查询数据库?
对于前一种情况使用:
public bool Exists<T>(T entity) where T: class
{
return this.Set<T>().Local.Any(e => e == entity);
}
Run Code Online (Sandbox Code Playgroud)
对于后一种情况使用(它也将检查加载的实体):
public bool Exists<T>(params object[] keys)
{
return (this.Set<T>().Find(keys) != null);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
EF代码首先不应该访问这种信息,但可以获得实体密钥的名称.我认为这样的事情应该有效:
var objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var objSet = objContext.CreateObjectSet<T>();
var keyNames = objSet.EntitySet.ElementType.KeyMembers.Select(m => m.Name);
Run Code Online (Sandbox Code Playgroud)
但这一切都没有意义.您需要通用方法,但您的实体不会共享必要的信息以允许通用方法.现在你说你甚至不知道关键值.使用这种"通用"方法将需要反射和手动构建表达式树.
Yuc*_*uck 21
感谢@Ladislav让我朝着正确的方向前进.这是通用Exists()方法的代码.
我想指出,这不需要反思,似乎表现得相当好.我唯一不感兴趣的是它TryGetObjectByKey()具有附加找到的实体的副作用.由于我不想Exists()有这种无意的结果,所以如果找到它,我必须分离该实体.
public Boolean Exists(T entity) {
var objContext = ((IObjectContextAdapter)this.DbContext).ObjectContext;
var objSet = objContext.CreateObjectSet<T>();
var entityKey = objContext.CreateEntityKey(objSet.EntitySet.Name, entity);
Object foundEntity;
var exists = objContext.TryGetObjectByKey(entityKey, out foundEntity);
// TryGetObjectByKey attaches a found entity
// Detach it here to prevent side-effects
if (exists) {
objContext.Detach(foundEntity);
}
return (exists);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59700 次 |
| 最近记录: |