2017-02-28 81 views
2

我正在使用ASP.NET Identity 2.0。目前,我謹表UserDetailsFirstName擴展應用程序用戶如何正確設置來自共享項目的關係

什麼是我的問題,延長ApplicationUser(改名爲AspNetUsersUsers)? 我有分開的類庫項目存儲EF模型。我不想生成另一個EF模型(如果沒有必要的話)。

我已經在用戶表和UserDetails表之間的SQL Server關係中,沒關係。不幸的是,在ASP項目中,用戶表格是在IdentityUser深處硬編碼的地方。這意味着我有ApplicationUser,它繼承IdentityUser

那我想是在AppDbContext

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    base.OnModelCreating(builder); 

    // Ignore columns 
    builder.Entity<ApplicationUser>().Ignore(c => c.PhoneNumberConfirmed); 

    // Rename tables 
    builder.Entity<ApplicationUser>().ToTable("Users"); 
    builder.Entity<IdentityRole>().ToTable("Roles"); 
    builder.Entity<IdentityRoleClaim<string>>().ToTable("IdentityRoleClaims"); 
    builder.Entity<IdentityUserClaim<string>>().ToTable("IdentityUserClaims"); 
    builder.Entity<IdentityUserLogin<string>>().ToTable("IdentityUserLogins"); 
    builder.Entity<IdentityUserToken<string>>().ToTable("IdentityUserTokens"); 

    // Relationship 
    builder.Entity<ApplicationUser>() 
     .HasOne(p => p.UserDetails) 
     .WithOne(i => i.Users) 
     .HasForeignKey<Shared.Database.UserDetails>(u => u.UserID); 
} 

問題是最後一行在WithOne(i => i.Users)i.UsersApplicationUser。有趣的是,ApplicationUser具有相同的屬性,如i.Users:D

所以我只需要知道如何正確地將其轉換爲關係。

任何想法如何解決這個問題?或者任何建議如何以另一種方式做到這一點?

共享的項目所使用的1個額外項目(WCF),所以我不能把有來自IdentityUser繼承:/

謝謝你們。

回答

2

我理解它的方式,您想要將兩個不同的對象映射到同一個數據庫表,並將另一個實體FK映射到該表。 ADN你有與第一部分沒有問題,但與第二個煩惱:

問題是在WithOne(i => i.Users)最後一行,i.UsersApplicationUser。有趣的是,ApplicationUser有一個像i.Users相同的屬性:d

我看到了兩個解決方案。

  1. UserDetails類中刪除導航屬性,只是在這兩個地方WithOne()使用。
  2. 如果你需要一個導航屬性,你可以按如下方式使用類似於Identity類結構的方法:

咱們說UserDetails類,您目前在共享項目如下:

public class UserDetails 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    // other properties ... 
    public string UserID { get; set; } 
    public User User { get; set; } // the problematic navigation property 
} 

你可以將其轉換爲一個通用類:

public class UserDetails<TUser> where TUser: class 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    // other properties ... 
    public string UserId { get; set; } 
    public TUser User { get; set; } 
} 

,讓舊的非通用類只是繼承從中:

public class UserDetails : UserDetails<User> { } 

現在一切都在共享項目中EF模型應該像以前一樣,所以使用它的其他(WCF)項目應該不會受到影響。

我想你已經明白了。在ASP項目,你只需創建另一個類:

public class ApplicationUserDetails : UserDetails<ApplicationUser> { } 

並將其映射到類似於你如何映射ApplicationUserUsersUserDetails表:

builder.Entity<ApplicationUserDetails>().ToTable("UserDetails"); 

然後改變UserDetails導航屬性在ApplicationUser類到:

public ApplicationUserDetails UserDetails { get; set; } 

並最終建立關係W/O任何親瑕疵:

builder.Entity<ApplicationUser>() 
    .HasOne(u => u.UserDetails) 
    .WithOne(d => d.User) 
    .HasForeignKey<ApplicationUserDetails>(d => d.UserID); 
+0

這是我正在尋找的答案,不幸的是它不是如何做到這一點,因爲實體關係總會出現一些錯誤。我必須完全重新設計它。無論如何謝謝:) – user1085907

+0

不客氣,很高興它幫助。雖然我希望它是一個真正的解決方案,不知道你的真實情況有什麼影響,但我想你知道更好:) –

+0

嗯,事情是,asp.net核心不支持ado.net在它不適合我基本的實體框架。所以我的下一步是生成基於實體框架核心的數據庫模型,它應該解決那些麻煩:) – user1085907

相關問題