none
Entity Framework многое ко многим RRS feed

  • Вопрос

  • Есть три таблицы:

    1. tab_autor
       *autor_Id (первичный ключ, автоинкромиент)
       *autor_Title
              (fk_tab_autor_tab_book_in_autor_autor_Id)

    2. tab_book
      *book_Id (первичный ключ, автоинкромиент)
      *book_Title
              (fk_tab_book_tab_book_in_autor_book_Id)

    3. tab_book_in_autor
      *autor_Id(первичный ключ)
      *book_Id(первичный ключ)
               (fk_tab_autor_tab_book_in_autor_autor_Id)
               (fk_tab_book_tab_book_in_autor_book_Id)


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

    public tab_autor Create_autor(string title)
            {
                tab_autor x = new tab_autor
                {
                    Title = title               
          
                };
                _db.AddTotab_autor(x);
                _db.SaveChanges();
                return x;
            }
    А как мне добавить данные в tab_book_in_autor ну и удалить естественно
    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:46 MSDN Forums Consolidation (От:Visual C#)
    17 декабря 2009 г. 9:04

Ответы

  • 1. Я позволил себе в таблицах для ключевых полей использовать тип uniqueidentifier, с ним меньшее геморроя, чем с числовым типом…

     2. В рамках данной задачи, если ты используешь EF соответственно, ты вообще должен забыть про существование промежуточной таблицы (book_in_autor). Добавление и удаление записей занимается сам ObjectContext.

    3. При проектировании БД ты обязательно должен указать в связях между таблицами каскадное удаление иначе будут проблемы при удалении связных записей.

    Допустим у нас есть 2 метода:

            /// <summary>

            /// Создание автора

            /// </summary>

            /// <param name="be">контекст</param>

            /// <param name="name">имя автора</param>

            /// <returns></returns>

            public TabAutor CreateAutor(BookEntities be, string name)

            {

                TabAutor autor = new TabAutor()

                {

                    GUID = Guid.NewGuid(),

                    Name = name,

                };

                be.AddToTabAutor(autor);

                return autor;

            }

     

            /// <summary>

            /// Создание книги

            /// </summary>

            /// <param name="be"></param>

            /// <param name="title"></param>

            /// <returns></returns>

            public TabBook CreateBook(BookEntities be, string title)

            {

                TabBook book = new TabBook()

                {

                    GUID = Guid.NewGuid(),

                    Title = title,

                };

                be.AddToTabBook(book);

                return book;

            }

     

    При помощи них мы легко можем заполнить БД данными например так:

     

                using (BookEntities be = new BookEntities())

                {

                    // Автор

                    TabAutor aNosov = CreateAutor(be, "Носов Н.Н.");

                    CreateBook(be, "Незнайка-путешественник").TabAutor.Add(aNosov);

                    CreateBook(be, "Незнайка учится").TabAutor.Add(aNosov);

                    CreateBook(be, "Огурцы").TabAutor.Add(aNosov);

     

     

                    // Книга

                    TabBook bFSQL = CreateBook(be, "Функции SQL");

                    CreateAutor(be, "Эйри Джоунс").TabBook.Add(bFSQL);

                    CreateAutor(be, "Райан К.Стивен").TabBook.Add(bFSQL);

                    CreateAutor(be, "Рональд Р. Плю").TabBook.Add(bFSQL);

                    CreateAutor(be, "Роберт Ф. Гаррент").TabBook.Add(bFSQL);

                    CreateAutor(be, "Алекс Критель").TabBook.Add(bFSQL);

                    be.SaveChanges();

                }

     

    или удалить например всех авторов:

     

                using (BookEntities be = new BookEntities())

                {

                    var Autors = from a in be.TabAutor

                                 select a;

                    foreach (TabAutor ta in Autors)

                        be.DeleteObject(ta);

                    be.SaveChanges();

                }

     

    При этом записи в таблице book_in_autor будут создаваться или удаляться атоматически!

    • Помечено в качестве ответа stuhin 27 февраля 2010 г. 18:06
    13 февраля 2010 г. 21:42

Все ответы

  • Интересует в первую очередь Linq to Entity

    22 декабря 2009 г. 6:43
  • 1. Я позволил себе в таблицах для ключевых полей использовать тип uniqueidentifier, с ним меньшее геморроя, чем с числовым типом…

     2. В рамках данной задачи, если ты используешь EF соответственно, ты вообще должен забыть про существование промежуточной таблицы (book_in_autor). Добавление и удаление записей занимается сам ObjectContext.

    3. При проектировании БД ты обязательно должен указать в связях между таблицами каскадное удаление иначе будут проблемы при удалении связных записей.

    Допустим у нас есть 2 метода:

            /// <summary>

            /// Создание автора

            /// </summary>

            /// <param name="be">контекст</param>

            /// <param name="name">имя автора</param>

            /// <returns></returns>

            public TabAutor CreateAutor(BookEntities be, string name)

            {

                TabAutor autor = new TabAutor()

                {

                    GUID = Guid.NewGuid(),

                    Name = name,

                };

                be.AddToTabAutor(autor);

                return autor;

            }

     

            /// <summary>

            /// Создание книги

            /// </summary>

            /// <param name="be"></param>

            /// <param name="title"></param>

            /// <returns></returns>

            public TabBook CreateBook(BookEntities be, string title)

            {

                TabBook book = new TabBook()

                {

                    GUID = Guid.NewGuid(),

                    Title = title,

                };

                be.AddToTabBook(book);

                return book;

            }

     

    При помощи них мы легко можем заполнить БД данными например так:

     

                using (BookEntities be = new BookEntities())

                {

                    // Автор

                    TabAutor aNosov = CreateAutor(be, "Носов Н.Н.");

                    CreateBook(be, "Незнайка-путешественник").TabAutor.Add(aNosov);

                    CreateBook(be, "Незнайка учится").TabAutor.Add(aNosov);

                    CreateBook(be, "Огурцы").TabAutor.Add(aNosov);

     

     

                    // Книга

                    TabBook bFSQL = CreateBook(be, "Функции SQL");

                    CreateAutor(be, "Эйри Джоунс").TabBook.Add(bFSQL);

                    CreateAutor(be, "Райан К.Стивен").TabBook.Add(bFSQL);

                    CreateAutor(be, "Рональд Р. Плю").TabBook.Add(bFSQL);

                    CreateAutor(be, "Роберт Ф. Гаррент").TabBook.Add(bFSQL);

                    CreateAutor(be, "Алекс Критель").TabBook.Add(bFSQL);

                    be.SaveChanges();

                }

     

    или удалить например всех авторов:

     

                using (BookEntities be = new BookEntities())

                {

                    var Autors = from a in be.TabAutor

                                 select a;

                    foreach (TabAutor ta in Autors)

                        be.DeleteObject(ta);

                    be.SaveChanges();

                }

     

    При этом записи в таблице book_in_autor будут создаваться или удаляться атоматически!

    • Помечено в качестве ответа stuhin 27 февраля 2010 г. 18:06
    13 февраля 2010 г. 21:42
  •  

    Спасибо за ответ! (небольшое дополнение к ответу)

    2. В рамках данной задачи, если ты используешь EF соответственно, ты вообще должен забыть про существование промежуточной таблицы (book_in_autor). Добавление и удаление записей занимается сам ObjectContext.

    Забывать нельзя  (добавь в таблицу еще одну строчку и таблица появится)

    3. При проектировании БД ты обязательно должен указать в связях между таблицами каскадное удаление иначе будут проблемы при удалении связных записей.

    Вовсе необязательно просто предусмотри в методе удаления удаление и из промежуточной таблицы 

    Что является важным на мой взгляд и на чем я споткнулся

    1. При проектировании базы а именно промежуточной таблицы обязательно нужно пометить оба поля связанные с родительскими первичным ключом(это самое важное иначе никакого добавления в промежуточную таблицу происходить не будет).

    2. Если база не спроектирована под каскадное удаление то при создании метода необходимо перебрать коллекцию промежуточной таблицы в этом месте тоже подводные камни присутствуют, но если пользоваться девизом при работе с EF "Незнаешь что происходит пиши ToList()" все получится


    private void mtRemoveUsersFromRole(string rolename)
            {
                var role = mtGetRoleByName(rolename);
                if (role.mytrip_Users != null)
                {
                    foreach (mytrip_Users x in role.mytrip_Users.ToList())
                    {
                        var user = mtGetUserByName(x.UserName);
                        role.mytrip_Users.Remove(user);
                        entities.SaveChanges();
                    }
                }
            }
    

     

    28 февраля 2010 г. 15:40