在我的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
{ }
根本没有构造函数。当然,我错过了一些东西或者找错了地方。
答案 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
答案 3 :(得分:-1)
IdentityDbContext<TUser>
继承自IdentityDbContext<TUser, IdentityRole, string>
,DbContext
继承自DbContext
。 public 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);
}
}
包含带有单个字符串的构造函数。