2013-04-29 60 views
1

假設下表實體框架非典型1- [0..1] - 模型只有協會 - EF LINQ選擇可能性

ParentEntities 
    ParentID 

ChildEntities 
    ChildID 
    ParentID 

這些表沒有FK架構中定義。

在EF設計,從數據庫生成後,我添加關聯:
- 家長多重性:1
- 兒童多重性:0或1

當我建,我得到的錯誤:「錯誤3027:無以下的EntitySet/AssociationSet指定映射 - 父子」

但是,如果我嘗試配置了這樣的關聯表映射..

Maps to ChildEntities 
    Parent 
    ParentID <-> ParentID (parent entity prop <-> child table column) 

    Child 
    ChildID <-> ChildID (child entity prop <-> child table column) 

..我得到這個:錯誤3007:從行xxx,xxx開始映射片段時出現問題:列[ParentID]正在被映射到兩個片段中不同的概念側屬性。

爲什麼這是一個錯誤沒有意義。當前實施的限制?


[編輯1]
我能夠通過創建一個1-N的關聯,使這項工作。這是不理想,但它的工作原理完全一樣,只需要在局部添加只讀子屬性:

public partial class Parent 
{ 
    public Child Child { get { return Childs.Any() ? null : Childs.First(); } } 
} 

這似乎是對我最好的解決方案。我不得不添加一個FK到數據庫來獲得EF來生成關聯和導航屬性,但是一旦它被添加,我就能夠刪除FK,並且從數據庫進一步更新到模型並沒有刪除關聯或導航屬性。


[編輯2]
因爲我是研究如何解決不關心該協會在EF建模,我遇到了另一個問題。取而代之的是隻讀子屬性的我做到了正常..

public partial class Parent 
{ 
    public Child Child { get; set; } 
} 

..但現在我需要一種方式來兌現,從查詢:

var query = from parents in context.Parents 
      // pointless join given select 
      join child in context.Childs 
       on parents.ParentID equals child.ParentID 
      select parents; 


我可以選擇匿名鍵入..

// step 1 
var query = from parents in context.Parents 
      join child in context.Childs 
       on parents.ParentID equals child.ParentID 
      select new { Parent = parents, Child = child }; 

..但後來我不得不消耗更多次獲得該到我的實體:

// step 2 
var results = query.Select(x => { 
        var parent = x.Parent; 
        parent.Child = x.Child; 
        return parent; }); 

有沒有更好的/簡化的方式來從查詢選擇這樣做,EF物化器可以從一開始就做到這一點?如果不是,那麼我會訴諸編輯1的方法論。

+0

如果您轉到模型瀏覽器 - > Model.Store,該關係可能與您在Model下的關係不同,只需刪除Model.Store表並重新添加即可。 – 2013-04-29 20:13:15

+0

@鮑勃,不知道我跟着。如何刪除然後重新添加商店表(哪一個?)改變任何東西?我從DB中添加了兩個表,並且表之間沒有內在關係(模型中也沒有)。這裏是我的model.store的圖像http://j.mp/ZgE29p – JoeBrockhaus 2013-04-29 20:29:19

+0

有一個EF錯誤,當你改變模型時,它不喜歡刷新EDMX的'.Store'。所以你必須找到一種方法來刷新它。 – 2013-04-29 20:46:35

回答

1

Ef代碼首先需要1-> 0 ..1的關係爲兒童擁有相同的主鍵。 也許這是一個類似的限制在這種情況下的建模者。 兩個表中都需要ParentId(Key)。

我從來沒有嘗試在數據庫中的設計師後綴中首先添加這樣的關係。

編輯:以符合您的EDIT2:

我會留在方向。使用導航屬性從Join返回到原始類A和B.

query = context.Set<JoinTable>.Where(Jt=>Jt.NavA.Id == ClassAId 
            && Jt.navB.Id == ClassBId) 

如果您需要從ClassA或ClassB返回的條目,請使用select。

+0

在閱讀你的答案後,我想我可以將該關聯添加爲1-N,但是這讓我陷入了其他一些問題。如果您有任何見解,我對這個問題做了一些編輯。謝謝! :) – JoeBrockhaus 2013-05-01 21:43:02

+0

雖然我沒有JoinTable - 只是2:Parents,Childs,也沒有關聯,所以沒有導航屬性(只是在部分擴展類中手動添加的實體屬性)。編輯2是關於尋找一種方法來選擇查詢單個父親與手動添加的屬性填充的物化作爲子實體的結果 – JoeBrockhaus 2013-05-02 15:59:43

+0

我使用連接表與許多情況。對不起,沒有進一步的想法,然後 – 2013-05-02 16:01:36