C#调用基类构造函数
在我的asp.net MVC应用程序中,我使用实体框架和标识进行用户身份验证。因此,我的DbContext类如下所示(它可以工作):C#调用基类构造函数,c#,entity-framework,asp.net-identity,C#,Entity Framework,Asp.net Identity,在我的asp.net MVC应用程序中,我使用实体框架和标识进行用户身份验证。因此,我的DbContext类如下所示(它可以工作): 公共类属性context:IdentityDbContext)我发现了以下内容- public class IdentityDbContext<TUser> : IdentityDbContext<TUser, IdentityRole, string> where TUser : IdentityUser {
公共类属性context:IdentityDbContext)我发现了以下内容-
public class IdentityDbContext<TUser> :
IdentityDbContext<TUser, IdentityRole, string>
where TUser : IdentityUser
{ }
public class IdentityDbContext:
IdentityDbContext
在哪里TUser:IdentityUser
{ }
根本没有构造函数。当然,我遗漏了一些东西或找错了地方。是的,您找错了地方:根据文档,IdentityDbContext
,其中一个带有字符串:
IdentityDbContext()
IdentityDbContext(数据库连接、, DbCompiledModel, 布尔值)
IdentityDbContext(字符串)
IdentityDbContext
继承自IdentityDbContext
,后者又继承自DbContext
DbContext
包含采用单个字符串的构造函数。引用的IdentityDBContext类继承自另一个类,该类随后继承自DbContext。看看上面参考文件的第29行,我实际上没有访问源代码的权限,但我想指出C#的一个棘手特性,即隐式运算符:
由于链接源中的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);
}
}
更新:
添加了一个小链接:您为AppContext
提供的代码在各种方面都是无效的-因为它显然不是从您的真实代码复制和粘贴的,所以我们无法判断实际代码是否只是在不相关的地方或关键部分有所不同。请复制并粘贴一个演示问题的实际类。您看到的差异是因为您在不同版本的Asp.net中使用了早期版本的Identity
(必须是4.x)。您在github上提到的代码是最新的Asp.net 5
版本,这就是为什么您会看到这么大的差异。@vendettamit我觉得我找错地方了。如果您还可以显示您正在使用的nuget软件包(完整的版本号),以便我们可以帮助您找到实际的源代码,这会有所帮助值得仔细检查-查看你的NuGet参考资料。但希望有人能帮助你。(这不是我的专业领域。)但你不继承构造函数。你不能跳过base
构造函数并调用base.base(string)
你是对的,这就是我的代码工作的原因。可以指向正确的存储库吗?我正在试图理解identity内部结构。@AmitHasan我不确定在哪里查找最新的源代码,但是如果您在Visual Studio中,并在调用IdentityDbContext
的构造函数的行上设置断点,您应该能够进入源代码并查看内部结构。感谢链接。我从未想到过隐式关键字。
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);
}
}