У меня есть модель EDMX для базы данных в отдельной библиотеке (например, Common.Feedback.Data
), которая включает в себя таблицу AspNetUser
и связанные с ней таблицы Identity Framework (извлеченные из другой существующей, работающей базы данных/приложения).
Я обновил строку подключения 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="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser@mydatabase;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
Во время выполнения любой доступ к логину приводит к следующей ошибке:
«Тип объекта ApplicationUser не является частью модели для текущего контекста»
Все ссылки, которые я пробовал, связанные с этой ошибкой, обычно включают способы обновления миграции.
Я не могу включить миграцию, так как это первая установка EDMX, но я предполагаю, что существует связь между объектом ApplicationUser
и таблицей aspnetusers
"где-то" за кулисами.
Есть ли у кого-нибудь здесь четкое представление о том, как класс ApplicationUser
сопоставляется с таблицей aspnetusers
и из нее во время выполнения, и объясняет, как заставить мой код работать с базой данных?
Воспроизведение шагов
- Создайте новое веб-приложение MVC с помощью VS 2013.
- Обновите все пакеты NuGet до последней версии.
- Возьмите существующую базу данных SQL с таблицами Identity Framework и скопируйте ее в новую таблицу (удалив все несвязанные таблицы).
- Добавить новые таблицы для проекта
- Создайте библиотеку классов для хранения моделей данных (например,
Common.Feedback.Data
) - Добавьте модель данных Edmx в библиотеку на основе базы данных, созданной ранее.
- Измените строку подключения, чтобы полностью квалифицировать сборку (не
res://*/
) - Измените имя строки подключения в
IdentityModel.cs
, чтобы оно соответствовало имени строки подключения в конфигурации. - Скопируйте строку подключения из
app.config
библиотеки вweb.config
веб-проекта. - Попробуйте войти, и вы столкнетесь с упомянутой ошибкой
Обновление:
Основываясь на случайном сообщении, я изменил свою строку подключения, чтобы она соответствовала обычному SQL-соединению, которое Identity Framework настроено для использования по умолчанию (и с использованием клиента Sql):
<add name="FeedbackSql"
connectionString="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser@mydatabase;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
и изменен на настройку, чтобы использовать это новое соединение:
public ApplicationDbContext()
: base("FeedbackSql", throwIfV1Schema: false)
{
}
Как ни странно, ошибка меняется на:
Магическое число в заголовке GZip неверно. Убедитесь, что вы передаете поток GZip.
Я думаю, что первоначальное изменение поставщика SqlClient верно, поэтому эта новая ошибка может быть связана с использованием базы данных Azure по этому соединению. Я открыт для предложений о том, что попробовать дальше.
Обновлен файл web.config на основе предложения @rism и эта ссылка (но ошибка 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>
Новое обновление:
Я создал совершенно новое веб-приложение со стандартной опцией user-security. Я также создал пустую базу данных в 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>
При попытке войти получаю следующую ошибку:
Магическое число в заголовке GZip неверно. Убедитесь, что вы передаете поток GZip. Описание: во время выполнения текущего веб-запроса возникло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.IO.InvalidDataException: неверное магическое число в заголовке GZip. Убедитесь, что вы передаете поток GZip.
Ошибка источника:
Строка 153: { Строка 154: var user = new ApplicationUser {Имя пользователя = model.Email, Email = model.Email}; Строка 155: var result = await UserManager.CreateAsync(user, model.Password); Строка 156: if (result.Succeeded) Строка 157: {
ApplicationDbContext
. Вы можете просто удалить весь этот мусор, иметь свой собственный DbContext и избавить себя от головной боли. - person James Sampica   schedule 28.01.2015DefaultConnectionFactory
вообще используется. - person Gone Coding   schedule 29.01.2015