Если ваше поле первичного ключа является полем идентификации, НЕ заполняйте его при вставке в базу данных.Например, для таблицы Customer со следующей структурой:
Customer
========
Customer_ID (PK, identity)
Last_Name (varchar)
First_Name (varchar)
Middle_Initial (char)
это возможно:
public int CreateCustomer(string lastName, string firstName, string middleInitial)
{
using (DataContext dc = new DataContext())
{
Customer customer = new Customer();
customer.Last_Name = lastName;
customer.First_Name = firstName;
customer.Middle_Initial = middleInitial;
dc.Customers.InsertOnSubmit(customer);
dc.SubmitChanges();
return customer.Customer_ID;
}
}
Наиболее вероятной причиной вашей ошибки является то, что вы пытаетесь получить доступ к сущностиобъект после DataContext, в котором он был создан, был уничтожен.Используя приведенный выше пример, вы получите ошибку, аналогичную той, которую вы, вероятно, получаете:
public int CreateCustomer(string lastName, string firstName, string middleInitial)
{
using (DataContext dc = new DataContext())
{
Customer customer = new Customer();
customer.Last_Name = lastName;
customer.First_Name = firstName;
customer.Middle_Initial = middleInitial;
dc.Customers.InsertOnSubmit(customer);
dc.SubmitChanges();
}
return customer.Customer_ID; // <<-- Error occurs here
}
Причина возникновения ошибки заключается в встроенном отслеживании изменений механизма LINQ.Когда DataContext создается, любые объекты сущностей, созданные в этом DataContext, привязываются к этому DataContext через ссылку в объекте сущности.Как только DataContext выпадает из области видимости, ссылка больше не действительна, и содержимое объекта сущности больше не считается надежным для механизма LINQ.
Что касается обработки транзакций, транзакция создается, когдаDataContext создан.Когда вызывается SubmitChanges
, все изменения выполняются в контексте транзакции DataContext, независимо от количества задействованных сущностей / таблиц.