Несмотря на то, что EF может автоматически определять отношения, обычно неплохо понять, как их явно отображать, чтобы вы могли справиться с ситуациями, когда это не совсем правильно. Это можно сделать с помощью переопределения OnModelCreating в DbContext или с помощью EntityTypeConfiguration<TEntity>
классов, загружаемых DbContext.
Например, с помощью OnModelCreating: (при условии, что пользователь примечания требуется, но примечание не имеет ссылки на пользователя)
// EF 6
modelBuilder.Entity<User>()
.HasMany(x => x.Notes)
.WithRequired()
.Map(x => x.MapKey("UserId"));
// EF Core
modelBuilder.Entity<User>()
.HasMany(x => x.Notes)
.WithOne()
.IsRequired()
.HasForeignKey("UserId");
То, что они делают, это устанавливает отношение для использования UserId в таблице Notes без необходимости объявления UserId или ссылки на пользователя в сущности Notes.
Из вашего примера неясно, откуда появляется «currentUser» при вызове AddNote. Когда отношения установлены правильно, EF назначит все необходимые FK автоматически. Предостережение заключается в том, что вам необходимо убедиться, что объекты были загружены из одного и того же DbContext. Одна потенциальная проблема, которую я вижу, - это область видимости для вашей переменной DbContext. Контексты должны быть недолговечными, поэтому следует избегать таких вещей, как статические или даже закрытые переменные-члены, так как вы хотите обеспечить удаление контекстов, когда они не нужны. Чтобы быть в безопасности, пользователь должен быть извлечен из того же DbContext, в который вы хотите сохранить примечание, и вам следует избегать передачи сущностей за пределы области действия своего DbContext. Передайте DTO или ViewModels (классы не-сущности POCO) или соответствующие данные, но загружайте / создавайте сущности в рамках контекста и не позволяйте им покидать его.
public void AddNote(NoteViewModel currentNote)
{
using(var context = new MyDBContext())
{
var currentUser = context.Users.Single(x => x.UserId = currentUserId);
var note = new Note
{
Text = currentNote.Text,
// ... other stuff.
};
currentUser.Notes.Add(currentNote);
context.SaveChanges();
}
}