c# - 检查 Entity Framework 中是否存在实体的通用方法?

标签 c# generics entity-framework-4.1

类似于Best way to check if object exists in Entity Framework?

我正在寻找一种通用方法来检查 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);
}

where item == entity 在 LINQ to SQL 中有效,但显然不适用于 LINQ to Entities。由于实体可能有不同的键,我不能让它们都继承自具有已知键的公共(public)抽象以进行比较。

我可以这样做,但我担心捕获异常作为验证过程的性能 这也不起作用,因为只要实体分离 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;
    }
}

最佳答案

如果实体存在,您是想要检查实体是否被上下文加载的通用方法还是查询数据库的通用方法?

对于前一种情况使用:

public bool Exists<T>(T entity) where T: class
{
    return this.Set<T>().Local.Any(e => e == entity);
}

对于后一种情况使用(它也会检查加载的实体):

public bool Exists<T>(params object[] keys)
{
    return this.Set<T>().Find(keys) != null;
}

编辑:

EF 代码优先不应访问此类信息,但可以获取实体键的名称。我认为这样的事情应该可行:

var objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var objSet = objContext.CreateObjectSet<T>();
var keyNames = objSet.EntitySet.ElementType.KeyMembers.Select(m => m.Name);

但这一切都没有意义。您想要通用方法,但您的实体不共享必要的信息以允许通用方法。现在你说你连键值都不知道。使用这种“通用”方法将需要反射(reflection)和手动构建表达式树。

关于c# - 检查 Entity Framework 中是否存在实体的通用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6018711/

相关文章:

c# - 使用 Serilog 的模式(通过 ILogger 与使用静态 Serilog.Log)

c# - 将 C# 对象保存到磁盘

c# - 在 C# 中使用 Neo4jClient 在 Neo4j 中创建节点之间的关系

c# - 排除通用约束中的类型(可能?)

c# - 继承类、泛型构造函数有问题

c# - STL multimap 与 .NET Dictionary<key, List<values>> 有何不同?

c# - 在 WPF 中的行的开头和结尾放置一个形状

c# - 忽略 Entity Framework 4.1 Code First 中的类属性

c# - Entity Framework - 加入列表

entity-framework - 在代码优先 Entity Framework 中手动编辑数据库