Использование Linq2Sql для вставки данных в несколько таблиц с использованием первичного ключа с автоматическим увеличением - PullRequest
4 голосов
/ 24 мая 2010

У меня есть таблица Customer с первичным ключом (int с автоматическим приращением) и таблица Address с внешним ключом таблицы Customer. Я пытаюсь вставить обе строки в базу данных в одной приятной транзакции.

using (DatabaseDataContext db = new DatabaseDataContext())
{
    Customer newCustomer = new Customer()
    {
        Email = customer.Email
    };

    Address b = new Address()
    {
        CustomerID = newCustomer.CustomerID,
        Address1 = billingAddress.Address1
    };

    db.Customers.InsertOnSubmit(newCustomer);
    db.Addresses.InsertOnSubmit(b);
    db.SubmitChanges();
}

Когда я запускал это, я надеялся, что таблица Customer и Address автоматически имела правильные ключи в базе данных, так как контекст знает, что это ключ с автоматическим увеличением и сделает две вставки с правильным ключом в обеих таблицах.

Единственный способ заставить это работать - это сначала сделать SubmitChanges () для объекта Customer, затем создать адрес и также выполнить SubmitChanges () для него. Это создаст два обращения к базе данных, и я хотел бы посмотреть, смогу ли я сделать это за одну транзакцию. Возможно ли это?

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 мая 2010

Клаус в принципе уже указал, что нужно сделать - попробуйте этот код:

using (DatabaseDataContext db = new DatabaseDataContext())
{
    Customer newCustomer = new Customer()
    {
        Email = customer.Email
    };

    Address b = new Address()
    {
        Address1 = billingAddress.Address1
    };

    newCustomer.Address = b;

    db.Customers.InsertOnSubmit(newCustomer);
    db.SubmitChanges();
}

Если вы связываете адрес b с клиентом, которого вы только что создали, а затем вставляете этого клиента в коллекцию db.Customers, вызов db.SubmitChanges() должен автоматически сохранить адрес, сохранить клиента и исправить любое из столбцы IDENTITY, чтобы сделать эту работу. Это действительно работает для меня в тестовом примере.

Вы пока не можете использовать адрес или идентификатор клиента - они еще не установлены. Но вы определенно можете связать полные объекты друг с другом и, таким образом, получить «связь» между ними на месте.

Чтобы это работало, вам нужно убедиться, что в конструкторе DBML в окне Properties для обоих столбцов идентификатора Auto Generated Value равен True, а Auto-Sync соответствует OnInsert ( оба из которых не являются значениями по умолчанию).

1 голос
/ 24 мая 2010

Если у вас есть отношение внешнего ключа в базе данных, у объекта Customer должна быть коллекция с именем Addresses, к которой вы можете Add свой экземпляр адреса с именем b. Если вы сделаете это, вам не нужно явно добавлять адрес к db.Addresses, он будет добавлен платформой автоматически, и будет вставлен правильный идентификатор клиента.

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