2011-08-24 106 views
1

我想做一個基本的Address班,許多不同的其他班可以有(公司可以有一個帳單地址和送貨地址,每個員工有一個家庭地址等)。我正在做這個模型 - 首先在EF4中,我認爲我可以做一個單向導航,但這是行不通的。這裏是我的:實體框架4單向導航/關係。我究竟做錯了什麼?

edmx模型。請注意,我創建了一個1-1關係,然後刪除了導航屬性Address,以便只有CompaniesEmployees引用Address,但該地址未引用其所有者。

Entity Framework 4 Model

生成的SQL看起來是正確的,因爲它創建所有3個表,然後強制執行公司 - >地址和員工 - >地址的關係,並執行執行的地址 - >公司或地址 - >員工關係。

-- 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; 

現在我要插入一個Company及其Address ...

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

測試失敗上SaveChanges()出現錯誤:

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

所以它看起來像EF試圖在公司的地址上執行不可通航的地址 - >員工關係...

我該如何做這項工作?這似乎是這種關係是相當普遍的做法...感謝您的任何幫助!

回答

2

你不能使它工作。執行不在數據庫中,而在您的模型中。您告知EF,Address在沒有CompanyEmployee(那些一對一關係)的情況下不能存在 - 如果在生成任何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」類型的數據。在數據庫中,它將所有字段存儲在同一個表中,但我想這並不重要。我想我只是將面向對象的邏輯應用於數據庫佈局,這是錯誤的。謝謝您的幫助! – CodingWithSpike