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!
내가 볼 수 없습니다 내 영구 객체와 상호 작용할 때 코드가 변경됩니다. 이것은 알려진 버그입니까? 내가 놓친 게 있니? 어떤 이유로 디자인에 의한 것입니까?
이 Interesting..i는 POCO의와 havent 한 '이 문제가 있었다를 사용 즐길 (전 모델에서 FK의를 포함하지 않지만 - 나는 점을 보지 않는다). – RPM1984
@ RPM1982 - 그래, 그게 문제 야. FK를 포함하지 않으면 문제가 사라집니다. –
호기심에서 모델에 FK를 포함시킨 이유는 무엇입니까? 일반적으로 네비게이션 속성으로 충분합니다. – RPM1984