实体框架,查询具有不确定列名的通用<t>存储库</t>

时间:2014-06-04 20:37:35

标签: c# entity-framework generics

这就是我所拥有的:

  • 实体框架5.x,模型第一
  • 我的数据库中的某些表具有UId列,但不是全部
  • 我正在使用通用存储库模式实现Entity。

我想要的是什么:

  • 添加资源时,确定资源是否具有UId字段,如果是,请确保该资源尚未使用。

以下是我未能成功实施的方法;

  1. 创建了一个需要UId字段的DomainLayer IUniquelyIdentifiable接口。
  2. 在实体项目中为具有UId的实体创建了部分类,并让它们实现步骤#1中的接口。
  3. 将以下代码放在通用实体存储库

    if (typeof(T).IsAssignableFrom(typeof(IUniquelyIdentifiable)))
        return DbSet.Any(e => ((IUniquelyIdentifiable)e).UId == UId);
    
    throw new InvalidOperationException("Can't check if Uid is taken, the resource is not uniquely identifiable");
    
  4. 但是,当我运行此代码时;

    • 首先,我的if语句不起作用。我验证了我的部分类确实实现了IUniquelyIdentifiable
    • 如果我评论'If'语句强制查询,我会得到一个例外:
      

    “指定的模式无效。错误:\ r \ n.CLR类型到EDM类型的映射不明确,因为多个CLR类型与EDM类型”ApprovedApplication“匹配。以前找到CLR类型'ToroMessagingService.Entity.ApprovedApplication',新找到CLR类型'ToroMessagingService.Common.DTOModels.ApprovedApplication'。“

    更新 我发现我可以通过重命名我的BLL类来修复此错误。但是,现在我得到LINQ只能进行原始强制转换的异常 - 因此它无法转换为接口。现在我对如何实施除暴力之外的其他方面感到茫然。

    我在EF很新(就像在第一个项目中一样),所以我很乐意提供任何帮助。

    以下是我要避免的事情:

    if (typeof (T).IsAssignableFrom(typeof (Entity.Account)))
        return Context.Set<Entity.Account>().Any(e => e.UId == UId);
    
    if (typeof (T).IsAssignableFrom(typeof (Entity.User)))
        return Context.Set<Entity.User>().Any(e => e.UId == UId);
    

0 个答案:

没有答案