【问题标题】:What's the correct way to use Effort with Entity Framework 6?将 Effort 与 Entity Framework 6 一起使用的正确方法是什么?
【发布时间】:2014-11-27 19:05:34
【问题描述】:

我正在尝试使用带有 Entity Framework 6 的 Effort 数据提供程序使一些测试代码工作。我正在尝试做的似乎应该是绝对最简单的用例,但我只是无法让事情顺利进行。

这是我的 DbContext 类:

public class CcdReductionFrameCatalogue : DbContext
    {
    public CcdReductionFrameCatalogue()
        : this("name=CcdReductionFrameCatalogue") {}

    public CcdReductionFrameCatalogue(string connectionString) : base(connectionString) {}

    public CcdReductionFrameCatalogue(DbConnection connection) : base(connection, true) {}

    public virtual DbSet<CcdFrame> CcdFrames { get; set; }
    }

POCO实体定义为:

public class CcdFrame : IEquatable<CcdFrame>
    {
    public CcdFrame()
        {
        AcquisitionTimeUtc = DateTime.UtcNow;
        }

    public int Id { get; set; }
    public string Location { get; set; }
    [FitsKeyword("INSTRUME")] public string CameraName { get; set; }

    [FitsKeyword("EXPTIME")] public double ExposureTimeSeconds { get; set; }

    [FitsKeyword("SET-TEMP"), FitsKeyword("CCD-TEMP")] public double TemperatureSetpoint { get; set; }

    [FitsKeyword("NAXIS1")] public int SizeX { get; set; }

    [FitsKeyword("NAXIS2")] public int SizeY { get; set; }

    [FitsKeyword("XBINNING")] public int BinningX { get; set; }

    [FitsKeyword("YBINNING")] public int BinningY { get; set; }

    [FitsKeyword("IMAGETYP")] public string FrameType { get; set; }

    [FitsKeyword("DATE-OBS")] public DateTime AcquisitionTimeUtc { get; set; }
    [FitsKeyword("XORGSUBF")] public int SubframeOriginX { get; set; }
    [FitsKeyword("YORGSUBF")] public int SubframeOriginY { get; set; }

    // IEquatable implementation elided for clarity
    }

[FitsKeyword] 属性是我定义的自定义属性,不应该与实体框架有任何关系。

在我的单元测试中,我这样设置数据连接,如 Effort 快速入门指南中所示:

        Connection = DbConnectionFactory.CreateTransient();
        Repository = new CcdReductionFrameCatalogue(Connection);

一旦我在 DbSet 上使用任何 LINQ,我就会收到愚蠢的无意义错误消息。例如,当我将我的存储库传递给这个简单的代码时:

    static void AddOrUpdate(CcdFrame newFrame, CcdReductionFrameCatalogue repository)
        {
        var existingFrames = from frame in repository.CcdFrames
                             where frame.Equals(newFrame)
                             select frame;
        Console.WriteLine(existingFrames.Count());
        // ...never gets past here

当我运行这段代码时,我得到:

System.NotSupportedException 无法创建类型为“TA.ReductionManager.DomainObjects.CcdFrame”的常量值。此上下文仅支持原始类型或枚举类型。
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter 父级,ConstantExpression linq)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter 父级,BinaryExpression linq)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression 输入)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter 父,MethodCallExpression 调用,ref DbExpression 源,ref DbExpressionBinding sourceBinding,ref DbExpression lambda)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter 父级,MethodCallExpression 调用)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter 父级,MethodCallExpression linq)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.AggregateTranslator.Translate(ExpressionConverter 父级,MethodCallExpression 调用)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter 父级,MethodCallExpression linq)
   在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert()
   在 System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
   在 System.Data.Entity.Core.Objects.ObjectQuery`1.c__DisplayClass7.b__6()
   在 System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction(Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   在 System.Data.Entity.Core.Objects.ObjectQuery`1.c__DisplayClass7.b__5()
   在 System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   在 System.Data.Entity.Core.Objects.ObjectQuery`1..GetEnumerator>b__0()
   在 System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
   在 System.Linq.Enumerable.Single(IEnumerable`1 源)
   在 System.Linq.Queryable.Count(IQueryable`1 源)
   在 FitsImporter.cs 中的 TA.ReductionManager.Specifications.FitsImporter.AddOrUpdate(CcdFrame newFrame, CcdReductionFrameCatalogue repository):第 38 行
   在 FitsImporter.cs 中的 TA.ReductionManager.Specifications.FitsImporter.ImportCollection(IEnumerable`1 集合,CcdReductionFrameCatalogue 存储库):第 29 行
   在 FileEnumeratorSpecs.cs 中的 TA.ReductionManager.Specifications.when_importing_fits_files_into_the_catalogue_and_there_are_no_subdirectories.b__5():第 27 行

现在这是令人麻木的简单 LINQ 代码,我在这里缺少什么?

【问题讨论】:

    标签: c# linq entity-framework entity-framework-6 effort


    【解决方案1】:

    您无法在 LINQ 查询中比较自定义对象。您应该只比较原始类型(int、string 等)。

    var existingFrames = from frame in repository.CcdFrames
                         where frame.Id == newFrame.Id
                         select frame;
    

    您可以在这里获取一些信息:Only primitive types or enumeration types are supported in this context

    【讨论】:

    • @TimLong 事情是 EF 无法将您的 Equals 方法转换为 SQL。我添加了指向另一个问题的链接,其中包含有关该问题的更多信息。
    • 嗯,我明白了。我从来没有想过它必须转换为 SQL(因为它可以与 LINQ to 对象一起正常工作)。现在说得通了。
    • @TimLong 是的,当某些代码完美地与 linq to objects 配合使用并使用 linq to sql 产生错误时,这很棘手
    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2018-04-10
    • 2013-01-02
    • 1970-01-01
    • 2020-08-27
    • 2020-07-10
    • 2020-09-29
    相关资源
    最近更新 更多