2010-12-16 1 views
3

Visual Studio 갤러리에서 다운로드 한 Microsoft의 POCO 코드 생성 템플릿과 함께 Entity Framework 4를 사용하고 있습니다. 데이터베이스에서 EF 모델을 생성 할 때 "모델에 외래 키 포함"옵션을 기본 옵션으로 남겨 두었습니다.POCO 템플릿이있는 Entity Framework 및 모델의 FKs - Null Ref 예외

아주 간단한 모델로이 문제를 재현 할 수 있었고, 선택적인 일대 다 관계에서 두 테이블/클래스 만 재현 할 수있었습니다. 이 경우 주소와 사람을 사용하고 있습니다. 개인은 1 개 또는 0 개의 주소를 가질 수 있으며 주소는 0 개에서 많은 개인을 가질 수 있습니다.

표는 다음과 같다 :

CREATE TABLE [dbo].[Person](
    [PersonID] [uniqueidentifier] NOT NULL, 
    [FirstName] [nvarchar](50) NULL, 
    [LastName] [nvarchar](50) NULL, 
    [AddressID] [uniqueidentifier] NULL, 
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC) 

CREATE TABLE [dbo].[Address](
    [AddressID] [uniqueidentifier] NOT NULL, 
    [Street1] [nvarchar](50) NOT NULL, 
    [Street2] [nvarchar](50) NULL, 
    [City] [nvarchar](50) NOT NULL, 
    [State] [char](2) NOT NULL, 
    [Country] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED ([AddressID] ASC) 

ALTER TABLE [dbo].[Person] WITH CHECK ADD CONSTRAINT [FK_Person_Address] 
FOREIGN KEY([AddressID]) 
REFERENCES [dbo].[Address] ([AddressID]) 

내가 주소 객체를 생성하고, 내가 null 참조 예외를 얻을 데이터베이스에서 가져온 기존 Person 객체에 추가하려고 :

TestPOCOEntities ctx = new TestPOCOEntities(); 

var person = ctx.People.FirstOrDefault(p => p.PersonID == new Guid("58AD37B4-1EBE-4649-940C-A141732C9901")); 

var addr = new Address {AddressID = Guid.NewGuid(), Street1 = "123 Main St"}; 
person.Address = addr; // This line throws the exception 

ctx.SaveChanges(); 

호출 스택을 파서 내 코드 또는 템플릿 생성 코드에서 예외가 발생하지 않고, AddressID 설정자의 Person 클래스에 대한 런타임 동적 프록시 내에 예외가 발생합니다. (특히 System.Data.Objects.EntityEntry.FixupEntityReferenceByForeignKey(EntityReference reference) 메서드)

POCO 템플릿 대신 기본 EF 코드 생성을 사용하면이 예외가 발생하지 않습니다. 또한 POCO 템플릿을 사용하지만 데이터베이스에서 모델을 생성 할 때 "모델에 외래 키 포함"체크 상자를 선택 취소하면 발생하지 않습니다.

나는 다음과 같은 추가하면 오류가 사라 얻을 수

: 모델에 외부 키를 POCO 템플릿을 사용하는 등의 조합이 이런 종류의를 요구해야하는 이유

var addr = new Address {AddressID = Guid.NewGuid(), Street1 = "123 Main St"}; 
ctx.Addresses.AddObject(addr); // Adding this line... 
person.Address = addr; // Means no more exception here! 

내가 볼 수 없습니다 내 영구 객체와 상호 작용할 때 코드가 변경됩니다. 이것은 알려진 버그입니까? 내가 놓친 게 있니? 어떤 이유로 디자인에 의한 것입니까?

+1

이 Interesting..i는 POCO의와 havent 한 '이 문제가 있었다를 사용 즐길 (전 모델에서 FK의를 포함하지 않지만 - 나는 점을 보지 않는다). – RPM1984

+0

@ RPM1982 - 그래, 그게 문제 야. FK를 포함하지 않으면 문제가 사라집니다. –

+1

호기심에서 모델에 FK를 포함시킨 이유는 무엇입니까? 일반적으로 네비게이션 속성으로 충분합니다. – RPM1984

답변