Я имел аналогичные проблемы, которые произошли в EF6 (сделал работу в EF4 без операций, EF 4 используются неявные операции с правом сферы).
Просто создание нового объекта и его сохранение не помогли в моем случае (см. Комментарии к другим ответам, у них были аналогичные проблемы с использованием dc.SaveChanges()
только для автоматического обновления).
Рассмотрим следующий код (CustomerId
первичный ключ с автоматическим приращением):
public void UpdateCustomer(string strCustomerName, string strDescription)
{
using (var transaction = CreateTransactionScope())
{
MyCustomer tbl=null;
Func<MyCustomer, bool> selectByName=(i => i.CustomerName.Equals(strCustomerName));
var doesRecordExistAlready = dc.MyCustomers.Any(selectByName);
if (doesRecordExistAlready)
{
// Updating
tbl=dc.MyCustomers.Where(selectByName).FirstOrDefault();
tbl.Description=strDescription;
}
else
{
// Inserting
tbl=new MyCustomer();
var maxItem=
dc.MyCustomers.OrderByDescending(i => i.CustomerId).FirstOrDefault();
var newID = maxItem==null ? 1 : maxItem.CustomerId+1;
tbl.CustomerId=newID;
tbl.CustomerName=strCustomerName;
tbl.Description=strDescription;
dc.MyCustomers.AddObject(tbl);
}
dc.SaveChanges(); // save all changes consistently
transaction.Complete(); // commit
}
}
И вспомогательную функцию для создания контекста правой сделки является:
// creates the right transaction scope
public static System.Transactions.TransactionScope CreateTransactionScope()
// needs to add ref: System.Transactions
{
var transactionOptions = new TransactionOptions
{
IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted,
Timeout = new TimeSpan(0,0,10,0,0) //assume 10 min is the timeout time
};
var scopeOption=TransactionScopeOption.RequiresNew;
var scope = new System.Transactions.TransactionScope(scopeOption,
transactionOptions);
return scope;
}
Хитрость здесь , чтобы разрешить чтение uncommitted - следовательно, вы можете запросить max ID и добавить 1 к id. То, чего я не смог достичь, - позволить SQL-серверу генерировать идентификатор автоматически, потому что EF позволяет мне не пропускать CustomerId
при создании.
Чтобы узнать больше о рамках сделки, look here.
Да, как правило, из созданных VS2010 фрагментов вам нужно будет установить значение StoreGenerated в верхнем большом блоке xml. Вы получаете несколько первичных ключей, потому что, если вы не измените это, EF генерирует идентификатор для вас, как 0. – Rangoric
Это безумие, что они еще не исправили эту вездесущую ошибку. Это версия 4, приходите в команду EF !! – arviman
Много раз люди забывают отмечать столбец значением Identity и auto increment. EF делает это из БД. – arviman