我有一個非常規範化的數據庫,我試圖將兩個連接表連接在一起。如何使用Linq和Entity Framework來加入兩個連接表?
我的目標是僅顯示用戶有權訪問的文檔。我使用實體框架,並有幾個外鍵設置爲下表:
關係(外鍵)
Users ---------------------------------------------
|
UserGroupMembership (UserID, GroupID)
|
|
Groups ----- -------------------------------------------------|
|
|
|---------------------------------------------------------|
|
|
XDocuments XDocumentSecurity (DocumentID, GroupID)
| |
---------------------------------------------
表定義
public partial class Users : EntityObject
{
public int UserID {get;set;} //PK
public string UserDisplayName {get;set;}
public DateTime CreateDate {get;set;}
public DateTime LoginDate {get;set;}
}
public partial class Groups : EntityObject
{
public int GroupID {get;set;} //PK
public string GroupDisplayName {get;set;}
public DateTime CreateDate {get;set;}
public DateTime LoginDate {get;set;}
}
public partial class UserGroupMembership: EntityObject // JoinTable
{
public int UserID {get;set;} //PK
public int GroupID {get;set;} //PK
// Not sure if this extra columns below causes an issue
public bool CanView {get;set;}
public bool CanDelete {get;set;}
public bool CanUpdate {get;set;}
public DateTime CreateDate {get;set;}
}
public partial class XDocumentSecurity : EntityObject // JoinTable
{
public int DocumentID {get;set;} //FK
public int GroupID {get;set;} //FK
public DateTime CreateDate {get;set;} // Not sure if this extra column causes an issue
}
public partial class XDocuments : EntityObject
{
public int DocumentID {get;set;} //PK
public string URL {get;set;}
public DateTime CreateDate {get;set;}
}
我我聽說過很多關於Linq to EF如何以一種性能次優的方式改變SQL查詢的故事。
這是is the .Union
operator sample,這似乎最適用於我在做什麼。我可以簡單地獲得組列表當前用戶中的一員,併發出此查詢的修改版本:
public void Linq50()
{
int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
int[] numbersB = { 1, 3, 5, 7, 8 };
var commonNumbers = numbersA.Intersect(numbersB);
Console.WriteLine("Common numbers shared by both arrays:");
foreach (var n in commonNumbers)
{
Console.WriteLine(n);
}
}
問題
- 如何查看SQL查詢EF生成?
- 什麼是更好的方式來解決這個問題(如果有的話)
呵呵,編輯之後我現在很困惑。爲什麼'XDocumentSecurity.GroupID'沒有引用'Groups.GroupID'而不是'UserGroupMembership.GroupID'?我想知道如何在SQL中定義它,因爲在關係中沒有(完整的)主鍵或唯一的列(這是必需的 - 至少在SQL Server中)。 – Slauma
@Slauma - 你說得對,我糾正了FK圖。 – LamonteCristo
什麼是EntityObject?是你自己的基類還是EF的EntityObject類?我想知道你的問題是用EF 4.1標記的。如果你使用'DbContext',那麼你不能從EF的'EntityObject'派生。是的,如果你想定義一個多對多的關係,連接表中的附加列是一個問題。您基本上必須爲每個多對多創建兩個一對多關係。最後的問題:爲什麼你的模型沒有任何導航屬性來定義實體之間的關係? – Slauma