Обновление LINQ to SQL - мое отношение к размышлению. Запрашивая советы по улучшению - PullRequest
0 голосов
/ 09 июня 2011

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

Представьте себе следующую ситуацию: у нас есть служба WCF, где клиент получает сущность Order через средства WCF., а затем изменяет некоторые свойства, а затем отправляет его обратно через WCF.Чтобы обновить такой объект обычно, нам нужно переписать каждое из свойств вручную, и я не хочу писать отдельный код для каждого класса (и переписывать его, например, при изменении свойств). Я пробовал Linq2SQLEntityBase, но почему-то не могу получитьэто работает, хотя я тщательно изучил пример.Итак, вот мое предложение:

public class Alterator<TEntity,TDataContext> 
    where TDataContext : DataContext, new()
{
    /// <summary>
    /// Updates a group of entities, performing an atomic operation for each of them (the lambda is executed for each entity separately).
    /// </summary>
    /// <param name="newOrModifiedEntity">Any kind of IEnumerable of entities to insert or update.</param>
    /// <param name="findOriginalLambda">A lambda expression that should return an original TEntity if the entity is to be updated or null if it is new.</param>
    public static void AlterAll(IEnumerable<TEntity> entities, Func<TDataContext,TEntity> findOriginalLambda)
    {
        foreach (TEntity newEntity in entities) {
            //a new DataContext initialization is required for this function to work correctly
            using (TDataContext dataContext = new TDataContext())
            {
                dataContext.DeferredLoadingEnabled = false;
                Type entityType = typeof(TEntity);

                ITable tab = dataContext.GetTable(entityType);
                TEntity originalEntity = findOriginalLambda(dataContext);

                //if the lambda returned no matching existing record in database, create a new one. No need to if-check for existence before as long as your lambda is properly built
                //(I suggest using SingleOrDefault() or FirstOrDefault() in queries).

                if (originalEntity == null)
                    tab.InsertOnSubmit(newEntity);

                else
                {

                    foreach (PropertyInfo p in entityType.GetProperties().Where(k => k.CanWrite))
                    {
                        var c = p.GetValue(newEntity, null);
                        var n = p.GetValue(originalEntity, null);

                        if (c != null && n != null && !c.Equals(n))
                            p.SetValue(originalEntity, c, null);
                    }
                    dataContext.SubmitChanges();
                }
            }
        }
    }

    /// <summary>
    /// Updates a single entity if the lambda expression returns a valid original entity. Inserts one if lambda returns null.
    /// </summary>
    /// <param name="newOrModifiedEntity">Entity to update or insert.</param>
    /// <param name="findOriginalLambda">A lambda expression that should return an original TEntity if the entity is to be updated or null if it is new.</param>
    public static void Alter(TEntity newOrModifiedEntity, Func<TDataContext, TEntity> findOriginalLambda) {
        AlterAll(new TEntity[] { newOrModifiedEntity }, findOriginalLambda);
    }
}

И пример кода обновления.Он находит заказ на основе его ключа - OrderItemID.Если возвращается значение null, будет создана новая запись.

 public void AlterOrderItem(OrderItem o) {
    Alterator<OrderItem, JDataContext>.Alter(o, t => t.OrderItems.Where(k => k.OrderItemID == o.OrderItemID).SingleOrDefault());
}

Есть ли лучший способ сделать это?Я пытался больше недели.

Ответы [ 2 ]

0 голосов
/ 09 июня 2011

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

0 голосов
/ 09 июня 2011

Я предлагаю взглянуть на West Wind Business Framework на западный ветер

или скачать

Это оболочка бизнес-объекта, которая облегчает жизнь

...