8

У меня есть базовая модель EDMX в отдельной библиотеке (например, Common.Feedback.Data), которая включает в себя таблицу AspNetUser и связанные с ней таблицы Framework Identity Framework (извлеченные из другой существующей, работающей, базы данных/приложения).Что связывает ApplicationUser с таблицей aspnetusers в базе данных First?

Я обновил строку ApplicationDbContext подключения к точке к новой модели и новому подключению к базе данных:

using System.Data.Entity; 
using System.Security.Claims; 
using System.Threading.Tasks; 
using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.EntityFramework; 

namespace Feedback.MvcApplication.Models 
{ 
    // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more. 

    public class ApplicationUser : IdentityUser 
    { 
     public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
     { 
      // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
      var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
      // Add custom user claims here 
      return userIdentity; 
     } 
    } 

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
     public ApplicationDbContext() 
      : base("FeedbackEntities", throwIfV1Schema: false) 
     { 
     } 

     public static ApplicationDbContext Create() 
     { 
      return new ApplicationDbContext(); 
     } 
    } 
} 

Строка подключения в файле web.config содержит полный путь к сборке и что ссылка является штрафом:

<add name="FeedbackEntities" 
    connectionString="metadata=res://Common.Feedback.Data/FeedbackModel.csdl|res://Common.Feedback.Data/FeedbackModel.ssdl|res://Common.Feedback.Data/FeedbackModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user [email protected];password=mypassword;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 

во время выполнения любой доступ для входа результатов в следующее сообщение об ошибке:

"The entity type ApplicationUser is not part of the model for the current context"

Все ссылки, которые я пробовал, связанные с этой ошибкой, обычно включают способы обновления миграции.

Я не могу включить миграции, поскольку это первая настройка EDMX, но я предполагаю, что существует привязка между объектом ApplicationUser и таблицей aspnetusers «где-то» за кулисами.

У кого-нибудь есть четкое представление о том, как класс ApplicationUser отображается в/из таблицы aspnetusers во время выполнения и объясняет, как заставить мой код работать с базой данных?

Репро шаги

  • Создание нового MVC веб-приложения с помощью VS 2013
  • Обновить все пакеты NuGet до последней
  • Возьмите существующую базу данных SQL с таблицами Идентичность Framework и скопировать его к новая таблица (вычеркните любые несвязанные таблицы).
  • Добавить новые таблицы для проекта
  • Создание библиотеки классов для хранения моделей данных (например Common.Feedback.Data)
  • Добавить модель данных EDMX, в библиотеке, на основе базы данных, созданной ранее
  • Изменить соединение строка, чтобы полностью квалифицировать сборку (не res://*/)
  • Измените имя строки подключения в IdentityModel.cs, чтобы соответствовать имени строки подключения в конфиге.
  • Скопируйте строку подключения из библиотеки app.config в web.config
  • Try входа в веб-проекта, и вы ударите упомянул об ошибке

Update:

Основываясь на шальной пост, я изменил моя строка подключения соответствует стандартным SQL-соединениям, которые Identity Framework настроена для использования по умолчанию (и с использованием клиента Sql):

<add name="FeedbackSql" 
    connectionString="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user [email protected];password=mypassword;MultipleActiveResultSets=True;App=EntityFramework" 
    providerName="System.Data.SqlClient" /> 

и изменен для установки, чтобы использовать эту новую связь:

public ApplicationDbContext() 
     : base("FeedbackSql", throwIfV1Schema: false) 
    { 
    } 

причудливо ошибка изменяется на:

The magic number in GZip header is not correct. Make sure you are passing in a GZip stream.

Я думаю, что первоначальное изменение поставщика SqlClient является правильным, так что эта новая ошибка может быть связано с использованием базы данных Azure по этому соединению. Я открыт для предложений о том, что попробовать дальше.

Обновлено web.config на основе предложений по @rism и this link (но ошибка GZip сохраняется):

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> 
     <parameters> 
     <!--<parameter value="mssqllocaldb" />--> 
     <parameter value="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=myuserid;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 

Опять на основе советов от @rism Я также попробовал эту версию (но ошибка GZip сохраняется) :

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v12.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 

нового обновление:

Я создал новое веб-приложение со стандартом пользовательская безопасность опция. Я также создал пустую базу данных в Azure.

Я не сделал ничего, кроме изменить строку подключения по умолчанию для этого:

<connectionStrings> 
    <add name="DefaultConnection" 
     connectionString="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework" 
     providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

и подключения по умолчанию фабрики на это:

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v12.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 

При попытке входа в систему я получаю следующее сообщение об ошибке:

The magic number in GZip header is not correct. Make sure you are passing in a GZip stream. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IO.InvalidDataException: The magic number in GZip header is not correct. Make sure you are passing in a GZip stream.

Source Error:

Line 153: { Line 154: var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; Line 155: var result = await UserManager.CreateAsync(user, model.Password); Line 156: if (result.Succeeded) Line 157: {

+1

Если вы идете по маршруту DB-первого решения, нет никаких оснований придерживаться «ApplicationDbContext». Вы могли бы просто удалить весь этот мусор, иметь свой собственный DbContext и сохранить себе головную боль. – Shoe

+0

Вы только указали, что конструктор ApplicationDbContext() может показать весь класс. Также, какую версию Identity вы используете? Версия 1.0 сильно отличается от Версии 2. Сопоставления производятся между классами и таблицами через подклассы EntityTypeConfiguration, в которых вы настраиваете аспекты модели, такие как сопоставление ссылочной целостности, мощности и т. Д. Если вы использовали Fluent Api в TspIdentityMap: EntityTypeConfiguration , вы сделал бы такой оператор. ToTable («AspNetUsers»); т. е. вы сопоставляете объект класса кода TspIdentity с таблицей db. – rism

+0

Причина, по которой я хочу видеть весь ваш ApplicationDbContext, заключается в том, что сообщение читается мне так, как будто у вас нет DbSet в вашем контексте, и я обычно это создавал бы ошибку компилятора ... но тогда вы смешали и согласованные биты, поэтому позволяет видеть все то же самое. Также проверьте, что вы используете ту же версию Identity во всех проектах. – rism

ответ

11

Оригинальный вопрос был о том, как OWIN на карте ApplicationUser класс AspNetUsers стол.

Я декомпилировал DLL-документы Identity Framework с помощью DotPeek и обнаружил, что имя таблицы «AspNetUsers» просто связано с проводкой в ​​коде метода OnModelCreating. например

protected virtual void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     if (modelBuilder == null) 
     throw new ArgumentNullException("modelBuilder"); 
     EntityTypeConfiguration<TUser> typeConfiguration1 = ((EntityTypeConfiguration<TUser>) modelBuilder.Entity<TUser>()) 
     .ToTable("AspNetUsers"); 

Этот код использует отражение для создания списка имен полей из свойств в ApplicationUser. Он проверяет наличие всех этих имен полей с помощью простого SQL-запроса (системной таблицы, содержащей все имена полей), и подтверждает, что все они присутствуют.

Остальное - это простое сопоставление имен/значений с использованием построенных SQL-запросов.

Что касается другой части проблемы, подключения к базе данных, я создал новый вопрос, поскольку он a) не имеет отношения к названию этого и b) сводит меня с ума! Новый вопрос: Why am I getting "The magic number in GZip header is not correct." error using OWIN auth against Azure SQL