Я новичок в asp.net и пытаюсь создать реляционную базу данных с использованием структуры сущностей. К сожалению, я запутался в том, как обновить дочерние объекты и в какой таблице должен содержаться идентификатор.
Извините за любые опечатки в коде - это измененная версия, поэтому я не публикую груз бессмысленного кода.
public class Book
{
public Book()
{
}
public Book(BookViewModel book)
{
//Child table
Author author = new Author(book);
Author = author;
//
Length = book.length
Status = "Borrowed";
}
[Key, Required]
public int BookId { get; set; }
[Required]
public string Author { get; set; }
[Required]
public int Length { get; set; }
public virtual Author author { get; set; }
public virtual ICollection<CNote> Notes { get; set; }
}
public class Note
{
public Note()
{
}
public Note(User user, Message message)
{
User = user;
Message = message;
}
[Required, Key]
public int NoteId { get; set; }
public string User { get; set; }
public string Message { get; set; }
(Here BookId is auto generated by the migration in the database and is not in the model)
}
public class Author
{
public Author()
{
}
public Author(BookViewModel book)
{
Name = book.Name;
}
[Required, Key]
public int AuthorId { get; set; }
public string Name { get; set; }
//The migration kept auto-generating the AuthorId to be in Book, rather than BookId to be in Author. So I had to add
public Book book;
public int BookId;
}
По умолчанию объект Note заканчивался полем BookID в таблице миграции, но для Author поле AuthorId заканчивалось в Book - несмотря на то, что объекты были очень похожи (за исключением одного ко многим или один к одному) , Это означает, что у автора теперь есть BookId в модели, а также в базе данных.
На моей страничке модель:
Note note = new Note(user, message);
Book book = _context.Book.First(x => x.BookId == id);
if (book.Note == null)
{
book.Note = new List<Note>() { note };
}
else
{
book.Note.Add(note);
}
try
{
await _context.SaveChangesAsync();
}
Что отлично работает, однако:
Book book = new Book(BookModelView book);
try
{
_context.Ticket.Add(book);
await _context.SaveChangesAsync();
}
Не правильно добавляет объект автора - таблица пуста, и при проверке объекта книги генерируется BookID как -27xxx. Это может быть потому, что мне пришлось указать BookId в авторе, и поэтому он не добавляет автоматически BookID книги. Я действительно не понимаю, почему коллекция заметок принимает BookId по умолчанию, но отношение один к одному добавляет authorId в книгу.
К сожалению, поскольку bookId не генерируется до тех пор, пока книга не будет добавлена в контекст, я не могу вручную добавить ее к автору (и при этом я не думаю, что это необходимо, поскольку я этого не делаю для Notes).
Каков наилучший способ сделать это?