Entity Framework: объект со схемой уже определен - PullRequest
0 голосов
/ 24 июня 2018

В моей базе данных у меня есть две таблицы, а именно Book и User, которые имеют таблицу отношений M-to-M с именем BookXUser.В таблице взаимосвязей есть два поля, которые являются внешними ключами Book и User, и другое поле с именем bookShelf.Поскольку, используя только Entity Framework, я не смог найти способ вставить отношение M-M при одновременной вставке в bookShelf, я решил создать модель для таблицы отношений, которая определяется следующим образом:

        modelBuilder.Entity<Book>()
            .HasMany<UserData>(s => s.user)
            .WithMany(c => c.book)
            .Map(cs =>
            {
                cs.MapLeftKey("bookID");
                cs.MapRightKey("userID");
                cs.ToTable("BookXUser");
            });

        modelBuilder.Entity<BookXUser>()
            .HasRequired<UserData>(s => s.user)
            .WithMany(g => g.bookXuser)
            .HasForeignKey<int>(s => s.userID);

        modelBuilder.Entity<BookXUser>()
            .HasRequired<Book>(s => s.book)
            .WithMany(g => g.bookXuser)
            .HasForeignKey<int>(s => s.bookID);

Проблемы возникают, когда я выполняю следующую строку:

userDataRepo.FindBy(user => user.email == entry.email).FirstOrDefault()

The EntitySet 'BookUserData' with schema 'dbo' and table 'BookXUser' was already defined. Each EntitySet must refer to a unique schema and table.

Как можно решить эту ошибку, сохранив таблицу отношений как модель, которая ссылается на BookXUser?Идея заключается в том, что я использую ленивую загрузку виртуальных методов, имеющихся в модели BookXUser, чтобы мне было проще получать свои книги и пользователей, а также я вручную вставляю в них свои данные, чтобы заполнить поле книжной полки.

public class BookXUser : IEntityBase
{ 
    public int ID { get; set; }
    public int bookID { get; set; }
    public virtual Book book { get; set; }
    public int userID { get; set; }
    public virtual UserData user { get; set; }
    public string bookShelf { get; set; }
}

Сущность Book

public class Book : IEntityBase
    {
        public int ID { get; set; }
        public string title { get; set; }
        public string isbn { get; set; }
        public int noPage { get; set; }
        public string edition { get; set; }
        public string bLanguage { get; set; }
        public byte[] bookPic { get; set; }
        public string publisherSite { get; set; }
        public string bookFormat { get; set; }
        public DateTime releaseDate { get; set; }
        public DateTime initialReleaseDate { get; set; }
        public string publisher { get; set; }
        public string overview { get; set; }
        public virtual ICollection<Author> author { get; set; }
        public virtual ICollection<Genre> genre { get; set; }
        public virtual ICollection<UserData> user { get; set; }
        public virtual ICollection<Rating> rating { get; set; }
        public virtual ICollection<Review> review { get; set; }
        public virtual ICollection<BookXUser> bookXuser { get; set; }

        public Book()
        {
            this.author = new HashSet<Author>();
            this.genre = new HashSet<Genre>();
            this.user = new HashSet<UserData>();
            this.rating = new HashSet<Rating>();
            this.review = new HashSet<Review>();
            this.bookXuser = new HashSet<BookXUser>();
        }
    }

Сущность UserData

public class UserData : IEntityBase
    {
        public int ID { get; set; }
        public string username { get; set; }
        public string userpass { get; set; }
        public string email { get; set; }
        public byte[] userPic { get; set; }
        public string userOverview { get; set; }
        public DateTime joinedDate { get; set; }
        public virtual ICollection<Book> book { get; set; }
        public virtual ICollection<Review> review { get; set; }
        public virtual ICollection<Rating> rating { get; set; }
        public virtual ICollection<UserData> user { get; set; }
        public virtual ICollection<BookXUser> bookXuser { get; set; }

        public UserData()
        {
            this.book = new HashSet<Book>();
            this.review = new HashSet<Review>();
            this.rating = new HashSet<Rating>();
            this.user = new HashSet<UserData>();
            this.bookXuser = new HashSet<BookXUser>();
        }
    }

1 Ответ

0 голосов
/ 24 июня 2018

Вы определили свои Book и UserData сущности неправильно. Как вы говорите в своем вопросе, вы пытаетесь определить отношение «многие ко многим» между Book и UserData, поэтому вы добавили объединяющуюся сущность BookXUser, поскольку эта сущность содержит данные BookShelf. Эта объединяемая сущность будет по соглашению использовать BookXUser в качестве имени таблицы.

Также вы определили две коллекции:

  • ICollection<UserData> user в вашей Book сущности
  • ICollection<Book> book в вашей UserData сущности

Вы также используете эту свободную конфигурацию в своем методе OnModelCreating:

modelBuilder.Entity<Book>()
    .HasMany<UserData>(s => s.user)
    .WithMany(c => c.book)
    .Map(cs =>
    {
        cs.MapLeftKey("bookID");
        cs.MapRightKey("userID");
        cs.ToTable("BookXUser"); // <-- this is your error.
    });

Делая это следующим образом, вы добавляете еще одно соотношение многих ко многим между Book и UserData и используете BookXUser в качестве имени для таблицы соединений, которая уже используется вашей сущностью BookXUser you создал.

Чтобы решить вашу проблему, вам не нужно добавлять коллекции и настраивать отношения «многие ко многим» так же быстро, как вы. Зачем? Поскольку у вас есть объединяющаяся сущность BookXUser.

Итак:

  • удалите ICollection<UserData> user из вашего Book объекта и замените его на ICollection<BookXUser> BookXUser
  • удалите ICollection<Book> book из вашего UserData объекта и замените его на ICollection<BookXUser> BookXUser
  • удалите свободную конфигурацию, которую вы добавили для многопользовательских отношений между UserData и Book.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...