2017-08-01 163 views
0

我正在尋找關於EF Core與ASP.NET Core的一些建議。簡而言之,我正在尋找解決循環引用的最佳方法。EF核心循環參考ASP.NET核心用戶類

基本的前提是:我有一個User對象,它包含一個Character對象的ICollection,並且每個Character對象都包含一個關聯的用戶。

public class ApplicationUser : IdentityUser 
{  
    public ICollection<Character> Characters { get; set; } 
} 
public class Character 
{ 
    public Guid Id { get; set; } 

    [Required] 
    public ApplicationUser User { get; set; } 

    // other properties 
} 

由於EF處理循環引用沒有問題,這似乎不會在應用程序本身內引起任何問題。 問題是在數據庫級別我有兩個外鍵在這兩個表(AspNetUser和字符)有效地指向對方,這意味着我將無法從數據庫中刪除任何實體的實例,因爲它會違反相應的外鍵約束。

我對ASP.NET Core有些新鮮,所以可能會有一些約定或其他我已經錯過了關於如何處理用戶的約定。 從應用程序的角度來看,我有一個簡單顯示字符列表以及相關用戶用戶名的頁面。我目前認爲最好從Character類中刪除User屬性並將其替換爲UserId屬性(並讓應用程序邏輯將正確的用戶從UserManager中取出),但我不確定這會得到擺脫了通用的外鍵約束。

+0

所顯示的模型會產生只有一個FK('UserId'在'Character'表),你爲什麼有兩個? –

+0

我在這裏看不到任何刪除問題。 –

回答

0

您需要家長用戶添加到角色(一個一對多的關係),使您的收藏虛:

public class ApplicationUser : IdentityUser 
{  
    public virtual ICollection<Character> Characters { get; set; } 
} 
public class Character 
{ 
    public Guid Id { get; set; } 

    public string ParentId { get; set; } 

    public string UserId { get; set; } 

    [Required] 
    [ForeignKey("ParentId")] 
    public virtual ApplicationUser Parent { get; set; } 

    [Required] 
    [ForeignKey("UserId")] 
    public virtual ApplicationUser User { get; set; } 

    // other properties 
} 
+0

含義是'User'屬性是'Character'對象的父用戶,爲什麼需要第二個屬性? – Telvee32

+0

有用戶角色(讀取不同的用戶)還是讓用戶擁有不同類型的角色(如角色)? – Wouter

+0

用戶有0個或多個字符(讀RPG字符表)並且一個字符有一個父用戶。 – Telvee32