C#调用基类构造函数混淆

时间:2015-12-03 14:44:22

标签: c# entity-framework asp.net-identity

在我的asp.net MVC应用程序中,我使用实体框架和Identity进行用户身份验证。所以我的DbContext类看起来如下(它可以工作):

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
{ }

根本没有构造函数。当然,我错过了一些东西或者找错了地方。

4 个答案:

答案 0 :(得分:3)

是的,你找错了地方:根据文档IdentityDbContext has three constructors,其中一个需要string

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

答案 1 :(得分:1)

我实际上并没有访问源代码,但我想指出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

答案 2 :(得分:0)

您所引用的IdentityDBContext类继承自另一个继承自DbContext的类IdentityDbContext<TUser, TRole, TKey>。请查看上述参考文件IdentityDbContext.cs

的第29行

答案 3 :(得分:-1)

IdentityDbContext<TUser>继承自IdentityDbContext<TUser, IdentityRole, string>DbContext继承自DbContextpublic static class WebDriverExtensionMethods { public static IWebElement WaitAndFindElement(this IWebDriver driver, By by, int timeoutInSeconds) { if (timeoutInSeconds > 0) { var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)); return wait.Until(drv => drv.FindElement(by)); } return driver.FindElement(by); } } 包含带有单个字符串的构造函数。