Метод Get для объекта LINQ-TO-SQL - PullRequest
1 голос
/ 22 марта 2012

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

public Questionnaire(int id)
{
    this = (from q in db.Questionnaires
            where q.Id == id
            select q).SingleOrDefault();
}

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

Так, какова лучшая практика для этого? Я не могу использовать статический метод, потому что DataContext не сможет отследить любые изменения, которые я внесу в объект.

Должен ли я создать новый экземпляр класса, а затем вызвать метод GET для этого класса? т.е.

public Questionnaire Get(int id)
{
    return (from q in db.Questionnaires
            where q.Id == id
            select q).SingleOrDefault();
}

Тогда используйте это

Questionnaire qs = new Questionnaire();
qs = qs.Get(1);

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Вы можете попытаться следить за реализацией, предложенной Майком Хэдлоу в его блоге post .

По сути, вы будете реализовывать эту логику поиска (и другие операции) в классе, который действует как хранилище для объектов определенного типа (в вашем случае - Анкета).

Это будет что-то вроде следующего

var rep = new Repository<Questionnaire>(...);

var questionnaire = rep.GetById(1);
0 голосов
/ 22 марта 2012

Наиболее близким решением для вашего подхода является использование класса-оболочки с конструктором, который извлекает экземпляр Анкеты из БД. Я ненавижу такой подход (предпочтение отдается DAO , точно так же, как вышеупомянутый репозиторий).

public class QuestionnaireWrapper: Questionnaire {

    private Questionnaire _q;

    public QuestionnaireWrapper(int id)
    {
        _q = (from q in db.Questionnaires
            where q.Id == id
            select q).SingleOrDefault();
    }

    public new string Name 
    {
        get { return _q.Name; }
        set { _q.Name = value; }
    }

    [Other overrides, all of them]
}

То, что вы пытались достичь (this = ...), не возможно, потому что нарушает основные принципы программирования. Я использовал такой подход только один раз, когда мне нужно было создать переносимые обертки (: MarshalByRefObject) для объектов, которые не были удалены. И поверьте мне, это не чистый подход. Пожалуйста, не отрицайте меня за плохой код, когда я ясно говорю это; -)

Наблюдение №. 2: прочитав вторую часть вашего кода, я обнаружил, что вы были близки. Вот почему статические методы для! :)

public static Questionnaire Get(int id)
{
    return (from q in db.Questionnaires
            where q.Id == id
            select q).SingleOrDefault();
}

тогда

Questionnaire qs = Questionnaire.Get(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...