2015-12-03 93 views
1

在我的asp.net MVC應用程序中,我使用實體框架和身份進行用戶身份驗證。所以我的DbContext類看起來像下面(它的工作原理):C#調用基類構造器混淆

public class PropertyContext : IdentityDbContext<AppUser> 
    { 
     public PropertyContext() : base("name=PropertyBDConnection") { } 
     ... 
    } 

我傳遞一個字符串,PropertyContext的基本構造。因此,我可以假設IdentityDbContext具有一個將字符串作爲參數的構造函數。

但是在asp.net身份(here IdentityDbContext.cs)GitHub的倉庫,我發現以下各項

public class IdentityDbContext<TUser> : 
     IdentityDbContext<TUser, IdentityRole, string> 
     where TUser : IdentityUser 
{ } 

沒有構造的。當然,我錯過了某些東西或者看錯了地方。

+1

你給了'AppContext'的代碼以各種方式無效的 - 看到它顯然*不*複製和粘貼從你的真實代碼,我們不能分辨出實際的代碼在不相關的地方,還是在關鍵部分只是不同的。請複製並粘貼顯示問題的*實際班級*。 –

+2

你所看到的區別是因爲你在不同版本的Asp.net中使用'Identity'的先前版本(必須是4.x)。你在github上引用的代碼是最新的'Asp.net 5'版本,這就是爲什麼你看到這種差異。 – vendettamit

+0

@vendettamit我有一種感覺,我在錯誤的地方看。 –

回答

3

是的,你正在尋找在錯誤的地方:根據文檔,IdentityDbContexthas three constructors,其中一個需要string

  • IdentityDbContext()
  • IdentityDbContext(DbConnection, DbCompiledModel, Boolean)
  • IdentityDbContext(String)
+0

你是對的,這就是我的代碼工作的原因。可以指向正確的存儲庫?我試圖瞭解身份內部。 –

+0

@AmitHasan我不確定在哪裏查找最新的源代碼,但是如果您[啓用框架源代碼調試](https://msdn.microsoft.com/zh-cn/library/cc667410.aspx) Visual Studio並在調用IdentityDbContext構造函數的行上設置一個斷點,您應該能夠進入源代碼並查看內部消息。 – dasblinkenlight

+0

謝謝。我會嘗試。 –

-1

IdentityDbContext<TUser>繼承自IdentityDbContext<TUser, IdentityRole, string>,繼而繼承fr om DbContextDbContext包含採用單個字符串的構造函數。

+0

儘管如此,你不會繼承構造函數。 –

+0

你不能跳過'base'構造函數並調用'base.base(string)' –

+0

啊,是的,好點。 –

0

您所指的IdentityDBContext類繼承自另一個類IdentityDbContext<TUser, TRole, TKey>,該類繼而從DbContext繼承。看看上面的參考文件IdentityDbContext.cs

1

的第29行,我沒有實際訪問源代碼,但我想指出的是,在隱運營商的C#一個棘手的特點:https://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

因爲IdentityDBContext

,在你的鏈接源代碼中,有一個構造函數,它接受一個DBContextOptions,該類可以使用隱式轉換器將字符串轉換爲DBContextOptions的一個實例

這裏爲你完成一個片段來解釋這個工作如何模擬一種可能的方式爲了實現你所看到的,這並不意味着實際情況是這樣,可能你只是指向了錯誤的代碼庫,但是是一種可能性,

using System; 
public class Program { 
    public class IdentityDbContext { 
     public DbContextOptions Options { get; set; } 
     public IdentityDbContext(DbContextOptions options){ 
      this.Options = options; 
     } 
    } 

    public class DbContextOptions { 
     public string Config { get; set; } 

     public DbContextOptions(string config){ 
      this.Config = config; 
     } 

     public static implicit operator DbContextOptions(string config) { 
      return new DbContextOptions(config); 
     } 
    } 

    public static void Main() 
    { 
     IdentityDbContext f = new IdentityDbContext(new DbContextOptions("test")); //it's ok 
     Console.WriteLine(f.Options.Config); 

     IdentityDbContext f2 = new IdentityDbContext("testWithImplicit"); 
     Console.WriteLine(f2.Options.Config); 
    } 
} 

更新: 加入了小提琴鏈接:https://dotnetfiddle.net/aykOqq

+0

感謝您的鏈接。隱含的關鍵字從來沒有出現過。 –