2015-12-03 3 views
1

В моем приложении MVC asp.net Я использую сущность framework и Identity для аутентификации пользователей. Так что мой класс DbContext выглядит следующим образом (он работает):C# вызов конструктора базового класса confusion

public class PropertyContext : IdentityDbContext<AppUser> 
    { 
     public PropertyContext() : base("name=PropertyBDConnection") { } 
     ... 
    } 

Я передаю строку в базовый конструктор PropertyContext. Поэтому я могу предположить, что IdentityDbContext имеет конструктор, который принимает строку в качестве аргумента.

Однако в репозитории GitHub идентичности asp.net (here IdentityDbContext.cs) Я не нашел включено следующее:

public class IdentityDbContext<TUser> : 
     IdentityDbContext<TUser, IdentityRole, string> 
     where TUser : IdentityUser 
{ } 

Нет конструктора вообще. Конечно, я что-то упускаю или смотрю в неправильном месте.

+1

код вы дали для 'AppContext' недействителен различными способами - видя, как это ясно * не * копировать и вставлять из ваш реальный код, мы не можем определить, является ли фактический код только другим в нерелевантных местах или в ключевых частях. Скопируйте и вставьте * фактический класс *, который демонстрирует проблему. –

+2

Разница, которую вы видите, заключается в том, что вы используете предыдущую версию «Identity» в другой версии Asp.net (должно быть 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/en-us/library/cc667410.aspx) в Visual Studio и установите точку останова на строке, которая вызывает конструктор 'IdentityDbContext', вы должны быть в состоянии войти в исходный код и увидеть внутренности. – dasblinkenlight

+0

Спасибо. я попробую. –

-1

IdentityDbContext<TUser> наследует от IdentityDbContext<TUser, IdentityRole, string>, который, в свою очередь, наследует fr om DbContext. DbContext содержит конструктор, который принимает одну строку.

+0

Вы не наследуете конструкторов. –

+0

Вы не можете пропустить конструктор 'base' и вызвать' base.base (string) ' –

+0

Ах да, хорошая точка. –

0

Класс IdentityDBContext, который вы ссылаетесь на наследует от другого класса IdentityDbContext<TUser, TRole, TKey>, который затем наследует от DbContext. Посмотрите на линии 29 выше эталонного файл IdentityDbContext.cs

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

+0

Спасибо за ссылку. Неявное ключевое слово никогда не приходило мне в голову. –

Смежные вопросы