LINQ To SQL Включить существующий объект во вставку

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

Но в дополнение к этому, каждый раз, когда я добавляю комнату, я хочу добавить предмет мебели в качестве начального предмета. У каждого предмета типа «Мебель» есть «RoomID», обозначающий его местоположение. Таким образом, Комната содержит коллекцию Мебели. Ниже я являюсь частью «основной» мебели из базы данных, добавляю ее в коллекцию мебели комнаты и вношу изменения. Комната добавляется в базу данных, но столбец Furniture.RoomID остается нулевым.

public void AddResidentToUniverse(int residentID, int universeID)
{
    Universe uni = _context.Universes.FirstOrDefault(u => u.UniverseID == universeID);
    Resident res = _context.Residents.FirstOrDefault(r=>r.ResidentID == residentID);

    if (uni != null && res!=null)
    {
        Room e = new Room();
        Furniture primary = _context.Furnitures.FirstOrDefault(p => p.FurnitureID == new FurnitureController().GetPrimary(universeID).FurnitureID);

        e.UniverseID = uni.UniverseID;
        e.RoomName = res.RootName;
        e.ResidentID = residentID;
        e.Expired = null;
        e.Furniture.Add(primary);
        uni.Rooms.Add(e);

        _context.SubmitChanges();
    }
}

person Joe    schedule 06.06.2013    source источник
comment
как насчет того, чтобы сначала спасти комнату. а потом добавить мебель?   -  person cpoDesign    schedule 06.06.2013
comment
Конечно. Я пробовал это. Вместо e.Furniture.Add(основной); строку, после SubmitChanges() я добавил Furniture Primary = _context.Furnitures.FirstOrDefault(p => p.FurnitureID == new FurnitureController().GetPrimary(universeID).FurnitureID); Primary.RoomID = e.RoomID; _context.SubmitChanges(); Не уверен, что второй SubmitChanges() допустим   -  person Joe    schedule 06.06.2013


Ответы (2)


Вам нужно добавить строку, которая сообщает вашей базе данных, что вы хотите вставить. Например,

uni.Rooms.InsertOnSubmit(Room object);
uni.Furniture.InsertOnSubmit(furniture piece);

после этого вы можете написать свой

uni.SubmitChanges();

линия.

person CSadosky    schedule 06.06.2013
comment
Предмет мебели уже есть. Только номер новый. Я добавляю существующую часть в новую комнату. InsertOnSubmit для чего-то, что существует, вызывает «Невозможно добавить объект, который уже существует». - person Joe; 06.06.2013
comment
Можете ли вы добавить идентификатор в элемент мебели комнаты, а затем вставить комнату, используя строку InsertOnSubmit? Я имею в виду, можете ли вы установить e.FurnitureID = primary.ID? Вы должны убедиться, что вы добавляете правильное отношение внешнего ключа к вашему объекту Room. - person CSadosky; 06.06.2013
comment
Я не следую. У комнаты (e) нет идентификатора мебели, в ней есть коллекция мебели. - person Joe; 07.06.2013
comment
Как вы храните коллекцию в базе данных (в частности, как List‹Furinture› (или любой другой контейнер, который вы используете) хранится в качестве атрибута Room в таблице Room базы данных)? - person CSadosky; 07.06.2013
comment
Когда я делал это в прошлом, у меня был бы столбец в таблице «Мебель», который называется RoomID и имел бы отношение внешнего ключа к комнате, в которой он находится. Затем, когда создается объект «Комната», добавляется еще один объект «Мебель». в базу данных, а идентификатор комнаты присваивается объекту «Мебель». Затем, чтобы получить, вызовите foreach для таблицы «Мебель» и выполните поиск, где (x => x.RoomID = Room.ID). - person CSadosky; 07.06.2013

Я, наконец, укусил пулю и стер свой dbml, удалил и воссоздал таблицы и воссоздал свой dbml. Столбец Furniture.RoomID теперь корректно обновляется. Совершенно неудовлетворительный, неуклюжий и грубый подход, я знаю.

person Joe    schedule 08.06.2013