Проверка обновления 'проблема при обновлении сущности с использованием метода DataContext Attach - PullRequest
4 голосов
/ 07 октября 2011

Я пытаюсь создать метод обновления в общем хранилище как слой доступа к данным LINQ to SQL.

У меня есть такая сущность:

[Table]
public class Product
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true, 
     DbType = "Int NOT NULL IDENTITY")]
    public int Id { get; private set; }
    [Column(UpdateCheck = UpdateCheck.Never)]
    public string Name { get; set; }
    ....
}

Я установил Update Check = true для всех полей, кроме идентификатора, как @jeff Атвуд предлагает в этом посте , и я установил для свойства asModified в методе присоединения значение true, которое я нашел в этого поста следующим образом:

public void Update(T entity)
{
    _db.GetTable<T>().Attach(entity, true); 
    _db.SubmitChanges();
}

но я продолжаю получать одно и то же исключение:

Объект может быть присоединен как измененный без исходного состояния, только если он объявляет член версии или не имеетполитика проверки обновлений.

Так в чем же проблема ???

Рекомендуете ли вы какие-либо другие подходы для создания метода обновления в общем хранилище, кроме создания столбца меток времени в качестве версиичисло.

Ответы [ 2 ]

2 голосов
/ 26 декабря 2011

Мы использовали следующий код в нашем DAO для решения той же проблемы:
(например, только, сейчас у меня нет реального кода)

public void UpdateUser(tblUser user)
{
   WriteDataContect.Attach
   (
      user,
      ReadOnlyDataContext.tblUsers
                         .Select(o => o.UserId == user.UserId)
   );
   WriteDataContext.SubmitChanges();
}

ReadOnlyDataContext имеет TrackChanges = false;

Мы не могли найти другое решение, основанное на наших потребностях, без необходимости писать много кода. Изменение базы данных в соответствии с потребностями LinqToSql в столбце timestamp также не было для нас возможным.

Дополнительный вызов БД не создавал проблем в нашем тестировании.

0 голосов
/ 03 ноября 2011

Вы можете прочитать сущность из БД и скопировать поля.Мне не нравится этот подход, но когда мы сталкивались с подобными проблемами, нам приходилось это делать.

Вы никогда не знаете, был ли объект ранее загружен в контекст, и если это так, вы получите исключение.в любом случаеПо крайней мере, так обстоит дело с EF, но было бы логично и для linq для sql.

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