【问题标题】:C# calling base class constructor confusionC#调用基类构造函数混淆
【发布时间】:2015-12-03 14:44:22
【问题描述】:

在我的 asp.net MVC 应用程序中,我使用实体框架和身份进行用户身份验证。所以我的 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
{ }

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

【问题讨论】:

  • 您为AppContext 提供的代码在各种情况下都是无效的 - 显然它是不是从您的真实代码中复制和粘贴的,我们无法判断是否实际代码仅在不相关的地方或关键部分有所不同。请复制并粘贴一个演示问题的实际类
  • 您看到的差异是因为您在不同版本的 Asp.net(必须是 4.x)中使用先前版本的 Identity。您在 github 上引用的代码是最新的 Asp.net 5 版本,这就是为什么您会看到如此大的差异。
  • @vendettamit 我感觉我找错地方了。
  • 如果您还可以显示您正在使用的 nuget 包 - 完整的版本号 - 会有所帮助,以便我们可以帮助您找到实际的源代码。
  • 值得仔细检查 - 查看您的 NuGet 引用。但希望这足以让有人帮助你。 (这不是我的专业领域。)

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


【解决方案1】:

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

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

【讨论】:

  • 你是对的,这就是我的代码有效的原因。可以指向正确的存储库吗?我正在尝试了解身份内部结构。
  • @AmitHasan 我不确定在哪里查找最新的源代码,但是如果您在 Visual Studio 中 enable framework source debugging 并在调用 @987654328 的构造函数的行上设置断点@,您应该可以进入源代码并查看内部结构。
【解决方案2】:

我实际上没有访问源代码的权限,但我想指出 C# 的一个棘手的特性,即隐式运算符:https://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

由于 IdentityDBContext,在您的链接源中,有一个采用 DBContextOptions 的构造函数,该类可以使用隐式转换器从字符串转换为 DBContextOptions 的实例

这里为你做了一个 sn-p 来解释它是如何工作的,它模拟了一种可能的方式来实现你所看到的,这并不意味着实际情况就是这样,可能你只是指向一个错误的代码库,但这是可能的

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

【讨论】:

  • 感谢您的链接。我从来没有想到隐含的关键字。
【解决方案3】:

您所指的 IdentityDBContext 类继承自另一个类 IdentityDbContext&lt;TUser, TRole, TKey&gt;,然后该类继承自 DbContext。看上面参考文件IdentityDbContext.cs第29行

【讨论】:

    【解决方案4】:

    IdentityDbContext&lt;TUser&gt; 继承自 IdentityDbContext&lt;TUser, IdentityRole, string&gt;,而 IdentityDbContext&lt;TUser, IdentityRole, string&gt; 又继承自 DbContextDbContext 包含接受单个字符串的构造函数。

    【讨论】:

    • 你不继承构造函数。
    • 你不能跳过base构造函数并调用base.base(string)
    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2021-11-06
    • 2013-03-24
    • 2017-03-18
    • 2015-08-18
    • 2017-11-03
    • 2020-01-12
    相关资源
    最近更新 更多