Добавить связанные данные в личность - PullRequest
0 голосов
/ 27 августа 2018

Существует множество обучающих программ EF, использующих интерфейс IdentityUser, но никто не доходит до того, как добавлять / обновлять связанные данные для пользователя.Я использую ASP.NET MVC, поэтому предположим, что у меня есть следующая модель пользователя

  public class AppUser : IdentityUser
  {
      public ICollection<Message> msges { get; set; }
  }

И модель для сообщений

public class Message
{
    public string MessageId { get; set; }

    public string msg { get; set; }

    [DataType(DataType.Date)]
    public DateTime msgTime { get; set; }

    public string UserId { get; set; }
    public AppUser AppUser { get; set; }
}

И, конечно, dbcontextкласс, создающий таблицу сообщений и создающий отношение «один ко многим» между двумя моделями.

public class AppIdentityDBContext : IdentityDbContext<AppUser>
{
    public AppIdentityDBContext() : base() 
    { }

    public AppIdentityDBContext(DbContextOptions<AppIdentityDBContext> options) : base(options) 
    { }

    public DbSet<Message> Messages { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        builder.Entity<AppUser>()
                .HasMany(x => x.msges)
                .WithOne(y => y.AppUser);
    }
}

Это все круто, но как я собираюсь добавить новую запись сообщения для соответствующего пользователя?Читая учебники с «похожими» проблемами, я прочитал, что задание UserManager instance - обновлять пользовательские данные.Поэтому я попробовал что-то подобное в контроллере:

 // Find the user, what works
 AppUser Benny = UserMan.FindAsyncByName("BennyHill");

 // I create a message object than I add it the Benny's msgs property
 Benny.msgs.Add(newMessage);   // --> for some reason this throws nullreference exception

 // Next step would be to update the data with the UserManager instance
 await UserMan.UpdateAsync(Benny); 

Любая мудрость приветствуется.Спасибо, ребята.

1 Ответ

0 голосов
/ 27 августа 2018

Ошибка будет связана с тем, что для коллекции в сущности по умолчанию установлено значение #null.Чтобы добавить в коллекцию, вы должны сначала загрузить коллекцию.Во-первых, может быть полезно настроить коллекцию как виртуальную, чтобы EF проксировал ее и мог при необходимости выполнять отложенную загрузку.Это помогает автоматически инициализировать элементы коллекции, чтобы избежать нулевых ссылок, особенно при «новом» создании сущности ...

public class AppUser:IdentityUser
{
    public virtual ICollection<Message> msges { get; set; } = new List<Message>();
}

Здесь ваш пример, вероятно, будет работать, так как вы можете добавлять новые элементы в коллекцию msges.хотя обычно при работе с коллекциями вы хотите загружать список:

, если UserMan.FindAsyncByName возвращает IQueryable<AppUser>, то:

AppUser Benny= await UserMan.FindAsyncByName("BennyHill").Include(x => x.Msges);

В противном случае внутри FindAsyncByName выхочу включить .Include(x => x.Msges)

...