2011-01-26 3 views
3

하지 않습니다F 번호 Linq에 매핑은 SQL Linq에 속성으로 나는, F #으로 정의 된 다음 클래스를 가지고 아무것도

member private x.expenses = (new DataContext(connString)).GetTable<Expense>() 
    member x.Add (expense : Expense) = 
     x.expenses.InsertOnSubmit(expense) 
     x.expenses.Context.SubmitChanges() 

호출 SubmitChanges()는 아무런 예외도 발생시키지 않으며 아무 예외도 발생시키지 않습니다. 그래서 F # 객체라는 것이 있으면 확인해 보았습니다. 정확히 같은 매핑을 사용하여 C#에서 다른 클래스를 선언했습니다. 그런 다음 새 레코드를 삽입 할 수있었습니다. 이제 나는 그 차이점이 무엇인지 궁금하네요.

일부 반사경 조사는 F # 클래스의 C# 자동 가져 오기/설정 도구의 [CompilerGenerated] 및 [Serializable] 및 CompilationMapping (SourceConstructFlags.ObjectType)] 속성 중 하나 일 수 있습니까?

반사판 해체 작업 : http://pastebin.com/qTRfVcmm .NET 프레임 워크 코드에 대한 디버깅을 수행함으로써 편집

, 나는 DataContext를 인스턴스의 추적 객체의 내부 목록이 InsertOnSubmit와 SubmitChanges 사이에 일치하지 않는 것으로 나타났습니다 //

요구. SubmitChanges 호출의 시작 부분에이 목록은 비어 있습니다. 그 두 가지 참조가 동일한 DataContext 인스턴스를 대상으로하지 않으며, VS 디버거가이를 확인했다. 아직도, 그 이유는 모르겠다.

+0

C#과 F # 프로젝트에서 연결 문자열이 동일합니까? – sinelaw

+0

사실 F # 코드는 C# 어셈블리에서 호출됩니다. – Bartosz

+0

.NET 프레임 워크 코드에 대해 일부 디버깅을 수행하여 DataContext 인스턴스의 추적 된 개체의 내부 목록이 InsertOnSubmit 및 SubmitChanges 호출간에 일관성이 없다는 사실을 발견했습니다. SubmitChanges 호출의 시작 부분에서이 목록은 비어 있습니다. InsertOnSubmit이 작동하는 인스턴스와 완전히 다른 인스턴스처럼 ... // 편집 : 실제로 다른 인스턴스입니다. – Bartosz

답변

6

문제는 member의 첫 번째 사용 문제입니다. F # 멤버 (매개 변수가없는)는 속성처럼 동작하므로 x.expenses에 액세스 할 때마다 새 데이터 컨텍스트가 만들어집니다. 이 문제를 해결하려면, 당신은 let를 사용하여 필드에 테이블 객체를 저장할 수

type SomeType() = 
    let expenses = (new DataContext(connString)).GetTable<Expense>()  
    member x.Add (expense : Expense) =   
    expenses.InsertOnSubmit(expense) 
    expenses.Context.SubmitChanges() 

, 원래의 코드는 다음과 같을 것이다는 C# 구문 때문에 F 번호의 member x.Foo = <expr> 구문, 게터와 속성에 해당

Table<Expenses> Expenses { 
    get { return (new DataContext(connString)).GetTable<Expense>(); } 
} 

... 생성 된 데이터 컨텍스트의 사본이 여러 개인 이유를 설명합니다.

+0

완벽한! 고맙습니다. 조사를하는 동안 코드를 일부 로컬로 정의 된 DataContext로 변경했기 때문에 (확실히 다시 작성되지는 않을 것입니다), 어쩌면 당황스럽지 않은 것을 말할 수는 없을 것입니다. 컴파일에서 그 것;) – Bartosz

+1

이런 연결을 처리하는 데 문제가 없습니까? – justin

+0

Justin이 맞습니다 - 인스턴스 당 데이터 컨텍스트를 갖는 것이 확장 성 관점에서 좋은 생각처럼 보이지 않으며 컨텍스트 인스턴스에서 Dispose()를 호출하여 데이터베이스에 대한 기본 연결을 닫을 시점은 언제입니까? –