У меня есть базовая модель 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="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.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: {
Если вы идете по маршруту DB-первого решения, нет никаких оснований придерживаться «ApplicationDbContext». Вы могли бы просто удалить весь этот мусор, иметь свой собственный DbContext и сохранить себе головную боль. – Shoe
Вы только указали, что конструктор ApplicationDbContext() может показать весь класс. Также, какую версию Identity вы используете? Версия 1.0 сильно отличается от Версии 2. Сопоставления производятся между классами и таблицами через подклассы EntityTypeConfiguration, в которых вы настраиваете аспекты модели, такие как сопоставление ссылочной целостности, мощности и т. Д. Если вы использовали Fluent Api в TspIdentityMap: EntityTypeConfiguration, вы сделал бы такой оператор. ToTable («AspNetUsers»); т. е. вы сопоставляете объект класса кода TspIdentity с таблицей db. –
rism
Причина, по которой я хочу видеть весь ваш ApplicationDbContext, заключается в том, что сообщение читается мне так, как будто у вас нет DbSet в вашем контексте, и я обычно это создавал бы ошибку компилятора ... но тогда вы смешали и согласованные биты, поэтому позволяет видеть все то же самое. Также проверьте, что вы используете ту же версию Identity во всех проектах. –
rism