Как я могу вставить строку в моей базе данных, которая имеет внешний ключ, не добавляя строку в связанную таблицу? - PullRequest
0 голосов
/ 06 апреля 2020

Я создал Entity Model с базой данных First в моем проекте. В моей базе данных у меня есть две таблицы. Один для книг и один для автора. Книги имеют внешний ключ на авторском праве. И каждый раз, когда я хочу добавить новую книгу, я добавляю нового автора, даже если указанный автор уже существует или я получил ошибку.

Это мои занятия:

Книга

    public partial class BOOK
    {
        public int ID { get; set; }
        public string TITLE { get; set; }
        public int PAGENUMBER { get; set; }
        public int AUTHOR { get; set; }

        public virtual AUTHOR AUTHOR1 { get; set; }
    }

Автор

    public partial class AUTHOR
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public AUTHOR()
        {
            this.BOOK = new HashSet<BOOK>();
        }

        public int ID { get; set; }
        public string FIRSTNAME{ get; set; }
        public string LASTNAME{ get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<BOOK> BOOK { get; set; }
    }

Я пытался несколькими способами просто добавить книгу, и при создании я указал автора или добавил новую книгу в список авторов. В большинстве случаев это приводит к ошибке, и автор впервые добавляется в таблицу автора во второй раз. Может быть, я упускаю что-то очевидное или не знаю определенного метода, потому что я абсолютный новичок в Entity Framework.

РЕДАКТИРОВАТЬ: Я всегда пытался получить автора через запрос на выборку и передайте его в книгу как объект.

var functions= new DbFunctions();
var author = functions.SelectAuthor(8); //Select with the ID

var book = new BOOK()
    {
        AUTHOR1 = author,
        TITLE= "ABC",
        PAGENUMBER = 30,
    };

    var context = new EF6_DbFirst_DatabaseEntities();
    context.BOOK.Add(book);
    context.SaveChanges();

, который возвращает эту ошибку: System.InvalidOperationException: 'На объект сущности нельзя ссылаться несколькими экземплярами IEntityChangeTracker.'

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Я нашел простой ответ. Если я просто предоставляю идентификатор автора AUTHOR при создании книги, она работает. Я снова и снова пропускал этот простой путь.

var functions= new DbFunctions();
var author = functions.SelectAuthor(8); //Select with the ID

var book = new BOOK()
    {
        AUTHOR = author.ID, //this simple Change will did it correct
        TITLE= "ABC",
        PAGENUMBER = 30,
    };

    var context = new EF6_DbFirst_DatabaseEntities();
    context.BOOK.Add(book);
    context.SaveChanges();
0 голосов
/ 06 апреля 2020

Я не знаю много о методе Code First, но если вы хотите достичь своей цели, вы должны знать кое-что о INNER JOINS на sql сервере.

Я имею в виду Вы должны добавить новую строку в таблицу Книги , которая соответствует ключу в таблице Авторы , которую мы называем Внешний ключ .

Надеюсь эта ссылка может помочь вам достичь того, что вы хотите:

https://www.sqlservertutorial.net/sql-server-basics/sql-server-inner-join/

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