Лучший способ определения базы данных, к которой принадлежат производные классы во время выполнения - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть этот метод, который удаляет швейные карты из моего контекста EF.По сути, у меня есть основной класс SewingCard и около 15 классов, производных от SewingCard.Все эти классы имеют свои собственные DbSets.Я хочу, чтобы этот метод принимал параметр, представляющий собой список смешанных типов производных SewingCard.Поэтому, когда я пишу эту функцию, я действительно не знаю, какой тип швейной карты будет удален, за исключением того, что это швейная карта.Я думал об использовании отражения, и я сделал это, и это работает.Вы можете увидеть код ниже.Но я думаю, что некоторые вещи можно сделать лучше.Например, я делаю

var removeMethod = dbSet.GetType().GetMethod("Remove");
removeMethod.Invoke(dbSet, new[] { sewingCard });

, но я бы хотел сделать это так

dbSet.Remove(sewingCard)

Ниже приведен мой текущий код этого метода

public void RemoveSewingCards(List<SewingCard> sewingCards, ApplicationDbContext context)
{
    //getting the properties of context which holds SewingCards
    var dbSets = context.GetType().GetProperties()
            .Where(p => Attribute.IsDefined(p, typeof(IncludeSewingCards))).ToList();

    //iterating through sewingCards list
    foreach (var sewingCard in sewingCards)
    {               
        var sewingCardType = sewingCard.GetType();

        // getting the correct dbSet for the correct sewingCard
        var dbSet = dbSets.FirstOrDefault(d => d.PropertyType.GetGenericArguments()
                .Any(a => a == sewingCardType))
                .GetValue(context);

        //getting the Remove method of dbSet
        var removeMethod = dbSet.GetType().GetMethod("Remove");
        //calling the method
        removeMethod.Invoke(dbSet, new[] { sewingCard });
    }
}

Я пытался передать dbSet как IDbSet<dynamic>, но это, похоже, не работает для меня.Я, вероятно, делал что-то не так.dbSet становится нулевым, когда я пытаюсь разыграть его.

1 Ответ

0 голосов
/ 21 сентября 2018

Разве вы не можете сделать:

public void RemoveSewingCards(List<SewingCard> sewingCards, ApplicationDbContext context)
{
    //iterating through sewingCards list
    foreach (var sewingCard in sewingCards)
    {               
        var sewingCardType = sewingCard.GetType();
        var dbSet = context.Set(sewingCardType).Remove(sewingCard);
    }
}

https://msdn.microsoft.com/en-us/library/gg679544(v=vs.113).aspx

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