2014-11-27 5 views
0

Entity Framework 6의 노력 데이터 공급자를 사용하여 일부 테스트 코드를 사용하려고합니다. 가장 단순한 유스 케이스가되어야하는 것처럼 보이지만 실제로는 얻을 수 없습니다. 일할 것들.Effort를 Entity Framework 6에서 사용하는 올바른 방법은 무엇입니까?

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] 속성은 사용자가 내가 정의한 그 속성이며 모든이에 베어링이 안 :

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 엔티티는 다음과 같이 정의된다 : 여기

내 DbContext 클래스입니다 엔티티 프레임 워크. 노력상 빠른 시작 안내서에 나와있는대로 내 단위 테스트에서

, 나는이 같은 내 데이터 연결을 설정 : 최대한 빨리이 DbSet에 어떤 LINQ를 사용할 때

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

, 내가 바보 같은 의미를 얻을 수 오류 메시지. 예를 들어,이 사소한 코드로 내 저장소를 통과 할 때 :

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.NotSupportedExceptionUnable to create a constant value of type 'TA.ReductionManager.DomainObjects.CcdFrame'. Only primitive types or enumeration types are supported in this context. 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, ref DbExpression source, ref DbExpressionBinding sourceBinding, ref DbExpression lambda) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.AggregateTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) 
    at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert() 
    at System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.c__DisplayClass7.b__6() 
    at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction(Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.c__DisplayClass7.b__5() 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1..GetEnumerator>b__0() 
    at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() 
    at System.Linq.Enumerable.Single(IEnumerable`1 source) 
    at System.Linq.Queryable.Count(IQueryable`1 source) 
    at TA.ReductionManager.Specifications.FitsImporter.AddOrUpdate(CcdFrame newFrame, CcdReductionFrameCatalogue repository) in FitsImporter.cs: line 38 
    at TA.ReductionManager.Specifications.FitsImporter.ImportCollection(IEnumerable`1 collection, CcdReductionFrameCatalogue repository) in FitsImporter.cs: line 29 
    at TA.ReductionManager.Specifications.when_importing_fits_files_into_the_catalogue_and_there_are_no_subdirectories.b__5() in FileEnumeratorSpecs.cs: line 27

지금이 마음 numbingly 간단한 LINQ 코드입니다, 내가 무엇을 놓치고 이리?

답변

3

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

+0

일을 @TimLong는 EF는 SQL로 당신의 Equals 메서드를 번역 할 수 있다는 것입니다. 문제에 대한 추가 정보가있는 다른 질문에 대한 링크를 추가했습니다. –

+0

아 좋아, 알아. LINQ를 객체에 사용하면 문제가되지 않으므로 SQL로 변환해야합니다. 그것은 이제 완벽하게 이해됩니다. –

+0

@TimLong 그래, 일부 코드는 완벽하게 linq 개체와 함께 작동하고 SQL에 linq과 오류를 생성 할 때 까다 롭습니다 –