2016-10-11 2 views
0

я провожу так много времени, пытаясь реализовать универсальный метод, чтобы добавить или обновить объект с соответствующей организацией (отношение один ко многим), но я застрял ...Entity рамки 6: общий метод AddOrUpdate

Метод должен получает 2 параметра, первый - родительский, второй - дочерний. Цель состоит в том, чтобы сохранить дочернюю сущность в родитель (добавление, если не существует или обновление)

Существует общий метод подпись:

public static bool AddOrUpdate<T,U>(T ItemToSave,U ItemRelated, int ID) where T : class where U : class 
    { 
     using (var context = new dbContext()) 
     {     
      var parent = context.Set<T>().Find(ID); 
      if (parent == null) return; 
      // how to retrieve now the child (ItemRelated) from the parent (ItemToSave) in order to add into it or update ? 

      return context.SaveChanges() > 0; 
     } 
    } 

Этот метод находится в статическом классе «Сервис» и I хотите иметь возможность вызвать Service.AddOrUpdate (Order _order, OrderLine _orderline, _order.OrderId) из любого класса.

Я застрял в извлечении ребенка из родителя и добавил или обновил его.

Может ли кто-нибудь помочь мне в достижении этого?

+0

так что вы точно попробовали? "??" очевидно, не будет работать –

+0

извините, что я закончил свой вопрос –

+0

нет, они 2 объекта, ItemToSave может иметь 0 или более ItemRelated –

ответ

0

Ваш ItemRrelated должен реализовать некоторый интерфейс с свойством parentId. Тогда вы можете просто добавить его в DbSet, если он еще не существует.

var existingItemRelated == context.Set<U>().SingleOrDefault(ir => ir.ParentId == ItemRelated.ParentId && (/*your criteria to determine if child item equals the one in DB*/)); 

то, если оно не существует, добавьте его или отредактируйте, если существует.

EDIT

также, если вы не хотите, чтобы иметь общий интерфейс для лиц с родительскими элементами, которые можно передать выражение этому методу определения, если дети сущности имеет тот же родительский

public static bool AddOrUpdate<T, U>(T ItemToSave, U ItemRelated, int ID, Expression<Func<U,bool>> sameParentsExpression) where T : class where U : class 
{ 
    using (var context = new dbContext()) 
    { 
     var parent = context.Set<T>().Find(ID); 
     if (parent == null) return false; 
     // how to retrieve now the child (ItemRelated) from the parent (ItemToSave) in order to add into it or update ? 
     var existingItemRelated = context.Set<U>() 
            .Where(sameParentsExpression) 
            .SingleOrDefault(/*your criteria to determine if child item equals the one in DB*/); 

     return context.SaveChanges() > 0; 
    } 
} 

и позвоните по этому поводу

AddOrUpdate(order, orderline, order.OrderId, ol => ol.OrderId == order.OrderId) 
+0

«ir.ParentId» не работает, потому что мы не знаем о первичном ключе родителя, потому что это будет generic (T может быть любым классом) –

+0

T может быть любым классом, он не связан с идентификатором родителя ребенка. И класс U должен реализовать некоторый интерфейс с свойством ParentId, как я уже сказал. Другими словами, вы должны ограничить U как «где U: IChildWithParentId» –

+0

Константин Ершов Я дал вам больше объяснений по этому вопросу в моем вопросе, можете ли вы более подробно описать свое решение, пожалуйста? –

0

С учетом этих ограничений это просто невозможно. Подумайте об этом - единственное ограничение, которое вы указали, состоит в том, что каждый из них должен быть классом. Это не гарантирует, что существует родительская дочерняя связь, не говоря уже о том, как будет определено это отношение.

Дженерики не волшебство. Они просто позволяют вам обрабатывать элементы в предопределенном виде. И определение взаимодействия ДОЛЖНО существует до того, как мы напишем общий метод.