代码之家  ›  专栏  ›  技术社区  ›  Nic Strong

LinqToSql和抽象基类

  •  6
  • Nic Strong  · 技术社区  · 17 年前

    我有一些linq实体继承如下内容:

    public abstract class EntityBase { public int Identifier { get; } }
    
    public interface IDeviceEntity { int DeviceId { get; set; } }
    
    public abstract class DeviceEntityBase : EntityBase, IDeviceEntity
    {
      public abstract int DeviceId { get; set; }
    }
    
    public partial class ActualLinqGeneratedEntity : DeviceEntityBase
    {
    }
    

    在通用方法中,我查询DeviceEnityBase派生实体时使用的是:

    return unitOfWork.GetRepository<TEntity>().FindOne(x => x.DeviceId == evt.DeviceId);
    

    TEntity有一个约束,即它是一个DeviceEntityBase。此查询始终失败,出现InvalidOperationException,消息为“类成员DeviceEntityBase.DeviceId未映射”。即使我在抽象基类中添加了一些映射信息

    [Column(Storage = "_DeviceId", DbType = "Int", Name = "DeviceId", IsDbGenerated = false, UpdateCheck = UpdateCheck.Never)]
    
    4 回复  |  直到 17 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    哇,看来这一次我也许能在@MarcGravel!

    我也有同样的问题,然后我发现 this answer ,为我解决了这个问题!

    在你的情况下,你会说:

    return unitOfWork.GetRepository<TEntity>().Select(x => x).FindOne(x => x.DeviceId == evt.DeviceId);
    

    鲍勃是你叔叔!

        2
  •  4
  •   Marc Gravell    17 年前

    一些 通过鉴别器支持继承( here , here ),但您只能查询在LINQ模型中定义的类,即数据类本身,并且(在本例中更重要的是)查询本身必须根据数据类进行措辞:尽管TEntity是一个数据类,但它知道此处的属性是在实体基础上声明的。

    表达式工作如下所示,请注意,您可能希望将字符串作为参数传入,或者通过反射获取主键(如果它具有属性):

    static Expression<Func<T, bool>> BuildWhere<T>(int deviceId) {
        var id = Expression.Constant(deviceId, typeof(int));
        var arg = Expression.Parameter(typeof(T), "x");
        var prop = Expression.Property(arg, "DeviceId");
        return Expression.Lambda<Func<T, bool>>(
            Expression.Equal(prop, id), arg);
    }
    
        3
  •  1
  •   Micah    17 年前

    这种继承人映射在LinqToSql中是不可能的。映射已设置,无法映射到基类中的属性。这本书刚出版时,我花了几个月的时间研究它。最好的解决方案是使用实体框架。它为您创建对象模型提供了更大的灵活性。它将允许你完全按照你在这里试图做的去做。

    MSDN Article

        4
  •  0
  •   Community Mohan Dere    9 年前

    尝试 .OfType<>() 如张贴在这里 https://stackoverflow.com/a/17734469/3936440 ,这对我来说也很有效,有着完全相同的问题。