c# - пример - Тип объекта ApplicationUser не является частью модели для текущего контекста




entity framework identity (6)

Если вы сначала используете код, проверьте свою строку подключения, чтобы гарантировать, что имя поставщика является «SqlClient», как в providerName = «System.Data.SqlClient

Если вы сначала используете базу данных, проверьте свою строку соединения, чтобы гарантировать, что имя поставщика является «EntityClient», как в providerName = «System.Data.EntityClient

Я перехожу из Identity 1.0.0 в Identity 2.0.1, следуя этой article

и созданный код миграции ничего не значит о новом IdentityUser. Он не добавляет новые столбцы.

Поэтому я сделал новый проект и попробовал снова, но коды миграции пустые.

Чтобы исправить эту проблему, я сделал изменения непосредственно в SQL Server и снова импортировал мою базу данных в свое решение.

Теперь мой AspNetUser точно такой же, как мой IdentityUser как вы можете видеть

IdentityUser

public virtual int AccessFailedCount { get; set; }

public virtual ICollection<TClaim> Claims { get; }

public virtual string Email { get; set; }

public virtual bool EmailConfirmed { get; set; }

public virtual TKey Id { get; set; }

public virtual bool LockoutEnabled { get; set; }

public virtual DateTime? LockoutEndDateUtc { get; set; }

public virtual ICollection<TLogin> Logins { get; }

public virtual string PasswordHash { get; set; }

public virtual string PhoneNumber { get; set; }

public virtual bool PhoneNumberConfirmed { get; set; }

public virtual ICollection<TRole> Roles { get; }

public virtual string SecurityStamp { get; set; }

public virtual bool TwoFactorEnabled { get; set; }

public virtual string UserName { get; set; }

IdentityUser.cs

public class ApplicationUser : IdentityUser
{
    public bool Has_accepted_policy { get; set; }
    public int user_type_id { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {

    }
}

AspNetUser

public string Id { get; set; }

[Required]
[StringLength(256)]
public string UserName { get; set; }

public string PasswordHash { get; set; }

public string SecurityStamp { get; set; }

[StringLength(256)]
public string Email { get; set; }

public bool EmailConfirmed { get; set; }

public bool Is_Active { get; set; }

[Required]
[StringLength(128)]
public string Discriminator { get; set; }

public int? user_type_id { get; set; }

public bool Has_accepted_policy { get; set; }

public string PhoneNumber { get; set; }

public bool PhoneNumberConfirmed { get; set; }

public bool TwoFactorEnabled { get; set; }

public DateTime? LockoutEndDateUtc { get; set; }

public bool LockoutEnabled { get; set; }

public int AccessFailedCount { get; set; }

... other virtual properties 

и когда я пытаюсь зарегистрировать пользователя, у меня есть следующее исключение

Тип объекта ApplicationUser не является частью модели для текущего контекста

на этой линии

IdentityResult result = await UserManager.CreateAsync(user, model.Password);

Мой старт.Аукт.cs

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());

И в моем AccountController я объявляю свой UserManager таким образом

public AccountController()
    : this(Startup.UserManagerFactory(), Startup.OAuthOptions.AccessTokenFormat)
{
}

public AccountController(UserManager<ApplicationUser> userManager,
    ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
    UserManager = userManager;
    AccessTokenFormat = accessTokenFormat;
}

public UserManager<ApplicationUser> UserManager { get; private set; }

Я ничего не изменил, кроме новых свойств класса AspNetUser и он работал хорошо до миграции.

Аналогичная проблема с CodePlex отмечена как фиксированная, но они не дают решения

Кто-нибудь знает, как это исправить?

РЕДАКТИРОВАТЬ

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

РЕШЕНИЕ

Когда я редактировал свою базу данных, я не заметил, что в Identity 2.0.0 они изменили User_Id для UserId в AspUserClaims . После этого у меня была такая же ошибка, но затем я сделал то, что tschmit007 сказал о добавлении ApplicationDbContext в конструктор UserStore и теперь он работает.

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));

Моя проблема заключалась в том, что я пытался использовать сгенерированную строку соединения ADO.NET для сгенерированного и аутентифицированного контекста ApplicationDbContext . Я исправил его, используя отдельную строку подключения для аутентификации. Также обратите внимание на провайдера - для контекста аутентификации он должен быть System.Data.SqlClient :

<add name="DefaultConnection" connectionString="Server=qadb.myserver.com;Database=mydb;User Id=myuser;Password=mypass;" providerName="System.Data.SqlClient" />

У меня была такая же проблема. Я делаю первую разработку базы данных с файлом EDMX.
Если вы используете строку соединения, сгенерированную при добавлении файла EDMX в :base(“EDMXConnString”) вас, скорее всего, будет эта проблема.

Я исправил это, создав стандартную строку соединения, указывающую на базу данных, где находятся таблицы ASP.NET Identity.

<add name="MyConnString" connectionString="Data Source=server; Initial Catalog=db_name; User ID=user_id; Password=password; Connect Timeout=60;" providerName="System.Data.SqlClient" />

И затем использовал эту строку соединения в :base , и она сработала!

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("MyConnString")
    {
    }
}

Это произошло со мной, потому что я пытался подключить ApplicationUserManager и некоторые другие связанные зависимости, используя мой контейнер инъекций зависимостей. В некоторых случаях контейнер разрешил ApplicationDbContext, в других случаях встроенный инжектор в Owin разрешил его.

Самый простой способ убедиться, что этого не происходит, - не пытаться подключить какой-либо материал Auth, используя ваш контейнер DI, если вы действительно не знаете, что вы делаете с DI ... иначе просто разрешите Owin разрешить его с помощью встроенного в инжекторе.

Другими словами, удалите что-нибудь вроде:

 builder.RegisterType<ApplicationUserManager>().InstancePerRequest();

И просто пусть Owin решит его так, как он был построен:

 public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

Я столкнулся с этой проблемой, и это был конфликт имен объектов. IdentityConfig.cs использовал ApplicationUser, но он использовал автогенерируемый IdentityModels.ApplicationUser вместо моего DataAccess.ApplicationUser моего собственного контекста. Сделал идеальный смысл, как только я его нашел. Таким образом, я удалил автоматически сгенерированный IdentityModels.cs из базового шаблона WebAPI, но в любом случае не использовал его, а затем добавил оператор using в IdentityConfig.cs в свое собственное пространство имен DataAccess и правильное отображение. Если вы забудете шаблон, построенный для вас много, вы столкнетесь с проблемой:

public class ApplicationUserManager : UserManager<ApplicationUser> // the name conflict
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
    }

Я также получил это сообщение об ошибке, но причина и решение были разными. В моем случае я ввел новое свойство Id типа Guid в классе ApplicationUser. Совершенно допустимый синтаксис C #, но, по-видимому, он создал огромную путаницу для ядра Identity или EntityFramework, которое опирается на размышления, чтобы найти материал.

Удаление нового свойства Id в моем классе ApplicationUser разрешило эту ошибку.





asp.net-identity