Я делаю хобби-проект для себя, а позже превращаю его в портфолио. Я работаю в Entityframework 6 с бритвенными страницами.
Мой класс UserModel является потомком класса IdentityUser. (Я полагаю, вы знаете, что такое IdentityUser, если нет) https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-7.0
Внутри UserModel я также храню коллекцию GroupClass. Мой GroupClass имеет ICollection UserModels. Что создает отношение «многие ко многим» в EF6.
Когда я пытаюсь сохранить объект UserModel в групповом классе, я получаю сообщение об ошибке: Невозможно неявно преобразовать тип в AspNetCore.Identity.IdentityUser в System.collection.Generic.ICollection. Я так понимаю, мне как-то нужно изменить класс groupClass. Чтобы иметь возможность хранить идентификационную переменную вместо пользовательской модели Icollection. ` Чего я не понимаю, так это почему UserModel еще не является частью IdentityUser, поскольку он является дочерним и должен иметь те же параметры, что и родительский.
Мой вопрос: как мне хранить UserModel внутри моего группового класса?
public class GroupClassModel
{
[Key]
public int GroupClassID { get; set; }
// info dump removed
public string userID { get; set; }
public ICollection<UserModel>? userModels { get; set; }
}
public class UserModel : IdentityUser
{
// info dump removed
public int? groupClassID { get; set; }
public ICollection<GroupClassModel>? GroupClass{ get; set; }
}
if (ModelState.IsValid)
{
//info removed
if (newGroup == null)
{
var NewGroup = new GroupClassModel()
{
userModels = await userManager.GetUserAsync(User)
};
Context.groupClass.Add(NewGroup );
Context.SaveChanges();
}
return RedirectToPage("Index");
}
return Page();
public class Context : IdentityDbContext
{
Context(DbContextOptions<Context> options) : base(options)
{
}
public DbSet<GroupClassModel> groupClassModels { get; set; }
public DbSet<UserModel> UserModels { get; set; }
public DbSet<MasterModel> MasterModels { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
`
Я попытался изменить Iколлекцию в обоих классах на IКоллекцию. та же проблема. Я попытался изменить Icollection на IdentityUser, но получил массу других ошибок. Теперь я 50/50, если последний способ сделать это правильно.
GroupClassModel.userModels — это коллекция пользовательских моделей. Эта строка кода пытается установить для этого свойства один экземпляр UserModel.
// this generates an error
userModels = await userManager.GetUserAsync(User);
Вместо этого вам нужно создать новую коллекцию и добавить в нее UserModel текущего пользователя. (Вам также потребуется преобразовать возвращаемое значение userManager.GetUserAsync, которое является IdentityUser, в UserModel.)
userModels = new List<UserModel>();
// currentUser is an IdentityUser
var currentUser = await userManager.GetUserAsync(User);
// cast the IdentityUser to a UserModel
UserModel currentUserModel = (UserModel)currentUser;
userModels.Add(currentUserModel);
а, понятно, вот почему я не мог добавить несколько объектов в свою коллекцию в предыдущей работе. Но это работает отлично. Спасибо @jefftrotman