我想做一個基本的Address
班,許多不同的其他班可以有(公司可以有一個帳單地址和送貨地址,每個員工有一個家庭地址等)。我正在做這個模型 - 首先在EF4中,我認爲我可以做一個單向導航,但這是行不通的。這裏是我的:實體框架4單向導航/關係。我究竟做錯了什麼?
edmx模型。請注意,我創建了一個1-1關係,然後刪除了導航屬性Address
,以便只有Companies
和Employees
引用Address
,但該地址未引用其所有者。
生成的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試圖在公司的地址上執行不可通航的地址 - >員工關係...
我該如何做這項工作?這似乎是這種關係是相當普遍的做法...感謝您的任何幫助!
感謝您的回覆。在EF中對此進行建模的「正確」方式是什麼?在C#類中,我基本上想要:'class Address {}''class Employee {public Address EmployeeAddress; }'和'class Company {public Address CompanyAddress; }在EF中是否真的沒有辦法模擬這種關係? – CodingWithSpike
如果不能重複使用地址,將地址存儲在單獨的表中有什麼意義?它看起來更像是你需要一個複雜的類型。在實體的情況下,你必須開始改變關係1:0..1 –
我認爲複雜類型確實是我真正想要的。這正確地分離了C#中的「Address」類型的數據。在數據庫中,它將所有字段存儲在同一個表中,但我想這並不重要。我想我只是將面向對象的邏輯應用於數據庫佈局,這是錯誤的。謝謝您的幫助! – CodingWithSpike