2012-12-18 202 views
2

時排除屬性找不到任何匹配的解決方案。我們來看看MVC4應用程序,EF和CodeFirstSharpMembership提供程序。
有一個實體 實體框架5選擇

public class User 
{ 
    ... 
    public virtual ICollection<Role> Roles { get; set; } 
} 

和標準的角色實體:

public class Role 
{ 
    ... 
    public virtual ICollection<User> Users { get; set; } 
} 

當然,當我試圖使自己的實體FK到用戶

public class MyEntity 
{ 
    ... 
    public virtual User Developer { get; set; } 
} 

我總是得到自我介紹循環,因爲用戶反應了角色,角色受到了影響給用戶。
然後我tryed到

Context = new DataContext(); 
Context.Configuration.LazyLoadingEnabled = false; 

避免選擇任何外鍵,並選擇一些

var Developers = Context.MyEntities; 

當然我IQueryable的是沒有 「開發」 字段和之後。
然後我tryed到:

var Developers = Context.MyEntities.Include("Developer"); 

當然有自我Referrence循環。

如何繼續選擇FKeys並從用戶中排除「角色」字段?

+0

您是否收到錯誤? – IronMan84

+0

我得到一個異常「檢測的自參考外循環用類型‘System.Data.Entity.DynamicProxies.User_0AFA654F65C3FB4CE9ADD687E486B5EB3BE472E040A3B97DA79144EA5F3D75AC’。路徑‘行[0] .Developer.Roles [0]。用戶’」。 – linuxod

回答

3

,除非你正在使用無法處理自引用(如序列化)的方法應該不會出現與自引用實體的一個問題。如果你有序列化問題(我必須猜測,因爲你沒有提供任何你想要產生的錯誤信息,最有可能的序列化或數據綁定,我根本不知道),所以我會建議:

Turning off Proxy object creation on your DbContext.

DbContext.Configuration.ProxyCreationEnabled = false; 

通常這種情況是因爲應用程序是使用POCO對象(無論是T4生成或代碼優先)。當實體框架想要跟蹤對象中沒有內置到POCO對象中的更改時,會出現問題。爲了解決這個問題,EF創建了缺少POCO對象中的屬性並且不可序列化的代理對象。

我還想補充一點,你有一個XY Problem。你在問如何排除一個屬性(The Y Problem),因爲你認爲它會解決一個問題(The X Problem),它可能會或者可能不會。實際上你需要說明源問題(X),因爲最有可能的解決方案(就像我所描述的)根本不需要(Y)。

+0

對不起,我沒有提供更具體的信息。你是對的,我有問題JsonConvert.SerializeObject()方法(來自NewtonSoft.Json),我試圖做的 - 是在服務器端構建數據並將其提供給jqGrid.DbContext.Configuration.ProxyCreationEnabled =假;沒有得到任何結果,我的外鍵得不到結果。我會閱讀你提供的XY問題鏈接,稍後給出答案。謝謝。 – linuxod

+0

嘗試關閉'ProxyCreationEnabled',然後您可能必須編寫自己的[JsonConverter](http://james.newtonking.com/projects/json/help/index.html?topic=html/T_Newtonsoft_Json_JsonConverter.htm) 。 –

0

我的應用程序中有一個非常類似的結構,它也有用戶和角色。我爲我的應用程序做了什麼(這可能是你的答案),是我有第三個對象UserRole,它在User和Role表之間建立一個鏈接表。 UserRole對象中唯一的項目是用戶和角色表的FK。然後將用戶切換爲List<UserRole> Roles,您可以從角色對象中刪除用戶引用。

讓我知道這是否有效。

代碼:

public class UserRole 
{ 
    [Key, ForeignKey("User"), ColumnAttribute(Order=0)] 
    public int UserID { get; set; } 

    [Key, ForeignKey("Role"), ColumnAttribute(Order = 1)] 
    public int RoleID { get; set; } 

    public virtual GaiaUser User { get; set; } 

    public virtual Role Role { get; set; } 
} 
+0

試圖在用戶和角色之間創建該層。不幸的是它並沒有訣竅。我在我的問題帖子中寫道,我正在使用另一個成員資格提供程序,它已經在使用角色和用戶標準字段。 – linuxod