EF Database ASP.NET Core 2.2 Добавление дочернего объекта - PullRequest
0 голосов
/ 01 мая 2019

Я новичок в 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).

Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 01 мая 2019

Неважно - кажется, что он отлично работает с Книгой, содержащей AuthorId.

Я вернул ее в прежнее состояние, и теперь она работает (должно быть, я изменил что-то еще).

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