【问题标题】:LinqToSql and abstract base classesLinqToSql 和抽象基类
【发布时间】:2008-10-01 03:23:07
【问题描述】:

我有一些 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)]

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    哇,看来这一次我可以单挑@MarcGravell!

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

    在你的情况下,你会说:

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

    鲍勃是你的叔叔!

    【讨论】:

    • 谢谢。但这不会是“对接口编程”,不是吗?以下是 Scott 在weblogs.asp.net/scottgu/archive/2007/06/29/… 中的评论 - “将接口添加到您的 LINQ to SQL 数据模型类。LINQ to SQL 类是部分类 - 这意味着您可以直接将接口添加到它们。”这个建议在我们的场景中不起作用。有没有办法让它工作?
    【解决方案2】:

    LINQ-to-SQL 一些支持通过鉴别器(herehere)进行继承,但您只能查询在 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】:

      这种层级映射在 LinqToSql 中是不可能的。映射已设置,它无法映射到基类中的属性。当它第一次出现时,我花了几个月的时间。最好的解决方案是使用实体框架。它为您创建对象模型提供了更大的灵活性。它可以让你做你想做的事情。

      这里有一些关于实体框架的信息:MSDN Article

      【讨论】:

        【解决方案4】:

        尝试.OfType&lt;&gt;() 此处发布的https://stackoverflow.com/a/17734469/3936440,它适用于我遇到完全相同的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-11
          • 1970-01-01
          • 2015-03-28
          • 2013-01-20
          • 1970-01-01
          • 2018-11-06
          • 2016-07-05
          • 2011-06-15
          相关资源
          最近更新 更多