2010-03-09 33 views
1

遇到實體框架問題。我一直使用EntityKey填充EntityReferences,以消除在添加實體引用時無需查詢數據庫的時間。現在我想爲協會(EntityCollection)做同樣的事情,但我不知道從哪裏開始。下面是什麼,我試圖做EntityCollections設置一個EntityReference.EntityKey來填充集合

CREATE TABLE [dbo].[Foo](
[FooId] [int] IDENTITY(1,1) NOT NULL, 
[FooName] [nvarchar](50) NOT NULL, 
) 
CREATE TABLE [dbo].[Bar](
[BarId] [int] IDENTITY(1,1) NOT NULL, 
[BarName] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_Bar] PRIMARY KEY CLUSTERED 
) 
CREATE TABLE [dbo].[FooBar](
[FooId] [int] NOT NULL, 
[BarId] [int] NOT NULL, 
CONSTRAINT [PK_FooBar] PRIMARY KEY CLUSTERED 
) 
ALTER TABLE [dbo].[FooBar] WITH CHECK ADD CONSTRAINT [FK_FooBar_Bar] FOREIGN KEY([BarId]) 
REFERENCES [dbo].[Bar] ([BarId]) 

ALTER TABLE [dbo].[FooBar] CHECK CONSTRAINT [FK_FooBar_Bar] 

ALTER TABLE [dbo].[FooBar] WITH CHECK ADD CONSTRAINT [FK_FooBar_Foo] FOREIGN KEY([FooId]) 
REFERENCES [dbo].[Foo] ([FooId]) 

ALTER TABLE [dbo].[FooBar] CHECK CONSTRAINT [FK_FooBar_Foo] 

細節現在,當我這個映射到的EntityFramework我得到2個實體(Foo和Bar)具有多對多的關係。

我試圖做的是添加一個新的Foo實體與5酒吧關聯 我有酒吧的ID,但我不想查詢數據庫以獲得所有5個酒吧。我寧願只設置一個entityKey。

這可能嗎?

例如:

Foo myFoo = new Foo(); 
Foo.Name = "Hello" 
Foo.Bars = // now I would like to just populate a set of EntityKeys for the EntityCollection 

回答

1

只需附上stub entity

var bar = new Bar { Id = barId }; 
Context.AttachTo("Bars", bar); 
myFoo.Bars.Add(bar); 
Context.SaveChanges(); 

沒有DB查詢那裏bar

重要:您必須附上前bar添加的關係myFoo,使EF知道你不是要插入一個新的Bar

+0

Craig, 使用存根實體似乎是比填充EntityKey更好的方法,並且遠比再次查詢數據庫好得多。這是真的? – 2010-03-10 14:24:40

+0

取決於。在EF 4中,我可能會使用FK關聯。在EF 1中,存根實體可能比設置「EntityKey」更好,但需要(可能是間接的)訪問上下文。 – 2010-03-10 14:29:09

0

我不認爲你可以設置的EntityKey在這種情況下,因爲FooBar的聯接是(或者應該是)本身就是一個實體。您必須爲Foos和Bars之間要創建的每個多對多關係創建一個新的FooBar。