2011-08-24 3 views
1

많은 다른 클래스가 가질 수있는 기본 Address 클래스를 만들려고합니다. 회사는 청구서 수신 주소와 배송지 주소를 가질 수 있으며, 각 직원에게는 집 주소가 있습니다. 나는 EF4에서이 모델을 먼저하고 있는데, 나는 1-way-navigation을 할 수 있다고 생각했지만, 이것은 효과가 없다. 여기 제가 가지고있는 것이 있습니다 :Entity Framework 4 단방향 탐색/관계. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

edmx 모델. 1-1 릴레이션을 만든 다음 Address에 탐색 속성을 삭제하여 CompaniesEmployeesAddress을 참조하지만 주소가 해당 소유자를 참조하지 않도록 유의하십시오. > 주소 및 직원 - -

Entity Framework 4 Model

생성 된 SQL은 다음 3 개 테이블을 만드는 회사를 시행한다는 점에서 올바른 찾습니다> 주소 관계를, 그리고 하지이 주소를 적용하지 -> 회사 또는 주소 -> 직원 관계. EF 노력처럼

System.Data.UpdateException: Entities in 'Model1Container.Addresses' participate in the 'EmployeeAddress' relationship. 0 related 'Employee' were found. 1 'Employee' is expected.

그래서 같습니다

-- Creating table 'Addresses' 
CREATE TABLE [Addresses] (
    [Id] int IDENTITY(1,1) NOT NULL, 
    [Street] nvarchar(4000) NOT NULL, 
    [City] nvarchar(4000) NOT NULL, 
    [State] nvarchar(4000) NOT NULL, 
    [Zip] nvarchar(4000) NOT NULL 
); 
GO 

-- Creating table 'Companies' 
CREATE TABLE [Companies] (
    [Id] int IDENTITY(1,1) NOT NULL, 
    [Name] nvarchar(4000) NOT NULL, 
    [Address_Id] int NOT NULL 
); 
GO 

-- Creating table 'Employees' 
CREATE TABLE [Employees] (
    [Id] int IDENTITY(1,1) NOT NULL, 
    [Name] nvarchar(4000) NOT NULL, 
    [Address_Id] int NOT NULL 
); 
GO 

-- Creating foreign key on [Address_Id] in table 'Companies' 
ALTER TABLE [Companies] 
ADD CONSTRAINT [FK_CompanyAddress] 
    FOREIGN KEY ([Address_Id]) 
    REFERENCES [Addresses] 
     ([Id]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION; 

-- Creating foreign key on [Address_Id] in table 'Employees' 
ALTER TABLE [Employees] 
ADD CONSTRAINT [FK_EmployeeAddress] 
    FOREIGN KEY ([Address_Id]) 
    REFERENCES [Addresses] 
     ([Id]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION; 

지금 나는 CompanyAddress ...

[TestMethod] 
    public void TestMethod1() 
    { 
     var context = new Model1Container(); 
     context.AddToCompanies(new Company 
     { 
      Name = "TestCompany", 
      Address = new Address 
      { 
       Street = "TestAddress" 
      } 
     }); 
     context.SaveChanges(); 
    } 

이 테스트는 오류가있는 SaveChanges() 실패를 삽입 할 회사 주소에서 비 탐색 가능한 주소 - 종업원 관계를 시행합니다 ...

어떻게하면됩니까? 이런 종류의 관계가 상당히 일상적인 일처럼 보입니다 ... 어떤 도움을 주셔서 감사합니다!

답변

2

작동하지 않을 수 있습니다. 시행은 데이터베이스가 아니라 모델에 있습니다. 당신은 AddressCompanyEmployee (그러한 일대일 관계)없이 존재할 수 없다고 말했고, SQL이 생성되기 전에 실패 할 경우. 또한 생성 된 SQL을 확인하면 EF가 일대일 관계의 이런 종류를 지원하지 않기 때문에 관계는 일대일이 아니라 일대 다 관계가 아닙니다 (종속 엔터티의 PK가 주체로 FK 인 경우에만 지원합니다 실재).

+0

답장을 보내 주셔서 감사합니다. EF에서 이것을 모델링하는 "올바른"방법은 무엇입니까? C# 클래스에서는 기본적으로 다음을 원합니다 :'class Address {}'와'class Employee {public Address EmployeeAddress; }'및'class Company {public Address CompanyAddress; }'EF에서 그 관계를 모델링 할 수있는 방법이 정말로 없습니까? – CodingWithSpike

+0

재사용 할 수없는 경우 별도의 테이블에 주소를 저장하는 시점은 무엇입니까? 복잡한 유형이 필요한 것처럼 보입니다. 엔티티의 경우 1 : 0..1로 변경 관계를 시작해야합니다. –

+0

복잡한 유형이 실제로 내가 실제로 원하는 것 같아요. 그것은 C#에서 'Address' 유형의 데이터를 적절하게 구분합니다. DB에서 모든 테이블을 동일한 테이블에 저장하지만, 중요하지는 않습니다. DB 레이아웃에 객체 지향 로직을 적용하는 것만 같았습니다. 도와 주셔서 감사합니다! – CodingWithSpike

관련 문제