我正在尝试使用带有 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(表达式 linq) 在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter 父级,BinaryExpression linq) 在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式 linq) 在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression 输入) 在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter 父,MethodCallExpression 调用,参考 DbExpression 源,参考 DbExpressionBinding sourceBinding,参考 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(表达式 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,布尔 startLocalTransaction,布尔 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 代码,我在这里缺少什么?