2015-12-03 69 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

感谢您的链接。隐含的关键字从来没有出现过。 –