Использование метода ExecuteSprocAccessor библиотеки предприятия с обобщениями - PullRequest
0 голосов
/ 16 августа 2011

Я пытаюсь использовать один класс для обработки всего моего CRUD в базе данных, используя метод ExecuteSprocAccessor .NET Enterprise Library с обобщениями.В моем слое данных я пробовал что-то вроде этого:

public static class CRUDDatabase
{
    private static Database db = DatabaseFactory.CreateDatabase("ITS");

    public static T SelectSingle<T>(string sprocName, int id)
    {
        return db.ExecuteSprocAccessor<T>(sprocName, id).First();
    }
}

Тем не менее, я получаю ошибку сборки на обратной линии в методе SelectSingle (), которая гласит:

'T' должен быть неабстрактным типом с открытым конструктором без параметров, чтобы использовать его в качестве параметра 'TResult' в универсальном типе или методе 'Microsoft.Practices.EnterpriseLibrary.Data.DatabaseExtensions.ExecuteSprocAccessor (Microsoft.Practices.EnterpriseLibrary.Data.Database, string, params object []) '

Идея метода SelectSingle () заключается в том, что вы передаете имя хранимой процедуры и идентификатор записиобъект, который вы хотите из базы данных.В конце концов у меня будет SelectAll (), Update (), Delete () и т. Д. Параметры в этих методах будут разными, но вы поймете, чего я пытаюсь достичь.

После прочтения этой ошибки я начинаю думать, что это может быть невозможно, но кто-нибудь знает, может ли это работать?Кроме того, мои поля в базе данных соответствуют 1: 1 с полями в моих классах, поэтому я не указываю никаких картографов.

Спасибо

1 Ответ

3 голосов
/ 17 августа 2011

Компилятор говорит вам, что не так: он ожидает тип, в котором есть открытый конструктор с нулевым аргументом.Все, что вы передали, это T, на что он не может дать никаких гарантий, поэтому он не будет компилироваться.

Вам нужно добавить общее ограничение, чтобы ограничить типы T, которые могут быть.К счастью, это тривиально просто:

public static T SelectSingle<T>(string sprocName, int id)    
    where T : new()  // <---- here's the constraint
{
    return db.ExecuteSprocAccessor<T>(sprocName, id).First();    
}

Это говорит компилятору: «Любой тип, переданный здесь , должен иметь конструктор с нулевым аргументом.

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