Операции CRUD над идентификацией и связью пользовательских таблиц с использованием ядра структуры сущностей - PullRequest
0 голосов
/ 12 октября 2018

У меня есть следующий класс dbcontext:

public class AppDbContext : IdentityDbContext<AppUser>
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
    : base(options) { }
    public DbSet<Initiative> initiatives { get; set; }
    public DbSet<AppUser> AppUsers {get; set;}
}

У AppUsers есть связь один ко многим с initiave, например:

public List<Initiative> user_initiatives_created;

Инициатива имеет свойство навигации, определенное так:

public string UserId { get; set; }
[ForeignKey("UserId")]
public AppUser User { get; set; } 

Я пытаюсь создать объект инициативы и сохранить его в базе данных со следующим кодом, который выдает исключение нулевой ссылки на объект:

Initiative i = new Initiative(init_model);
AppUser user = await _dbContext.AppUsers.FindAsync(_usermgr.GetUserId(HttpContext.User));
i.User = user;
i.UserId = _usermgr.GetUserId(HttpContext.User);
user.user_initiatives_created.Add(i); //throws exception
_dbContext.initiatives.Add(i);
_dbContext.AppUsers.Update(user);
_dbContext.SaveChanges();

Я думаю, это потому, что i.Idпо-прежнему 0 и, следовательно, не может быть добавлен в базу данных.Но этому объекту не будет присвоен идентификатор, если только EF Core не назначит идентификатор после него SaveChanges().

Каков наилучший способ создания таблицы инициативы и одновременного обновления таблицы пользователя?

1 Ответ

0 голосов
/ 12 октября 2018

вам не нужно менять и пользователя, и инициативу.это должно работать, если вы оставите только следующий код:

Initiative i = new Initiative(init_model);
i.UserId = _usermgr.GetUserId(HttpContext.User);
_dbContext.initiatives.Add(i);
_dbContext.SaveChanges();

«Исключение нулевой ссылки» генерируется, потому что ваше свойство user.user_initiatives_created имеет значение null.В архитектуре приложения базы данных больше ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...