Как реализовать поле идентификатора в POCO, представляющем поле идентификации в SQL Server? - PullRequest
3 голосов
/ 01 июня 2010

Если у меня есть модель домена, у которой есть идентификатор, который сопоставляется со столбцом идентификаторов SQL Server, как выглядит POCO, содержащий это поле?

Кандидат 1: позволяет любому установить и получить идентификатор. Я не думаю, что мы хотим, чтобы кто-либо устанавливал идентификатор, кроме Repository, из таблицы SQL.

public class Thing {
    public int ID {get;set;}
}

Кандидат 2: Позволяет кому-либо устанавливать идентификатор при создании, но мы не узнаем идентификатор до тех пор, пока не создадим объект (фабрика создает пустой объект Thing, где ID = 0, пока мы не сохраним его). Как бы мы установили идентификатор после сохранения?

public class Thing {
    public Thing () : This (ID: 0) {}
    public Thing (int ID) {
        this.ID = ID
    }
    private int _ID;
    public int ID {
        get { return this.ID;};
    }

Кандидат 3: Методы для установки идентификатора?

Каким-то образом нам нужно было бы разрешить хранилищу устанавливать идентификатор, не позволяя потребителю изменить его. Есть идеи? Это лай не на то дерево? Отправляем ли мы объект в хранилище, сохраняем его, выбрасываем, затем создаем новый объект из загруженной версии и возвращаем его как новый объект?

Ответы [ 2 ]

4 голосов
/ 01 июня 2010

Как насчет общедоступного метода доступа get и внутреннего метода доступа set, который создает исключение InvalidOperationException, если базовое значение уже ненулевое?

Очевидно, у вас уже есть какой-то способ материализации поля, чтобы вы могли даже загрузить запись. Почему бы просто не использовать тот же механизм? В конце концов, вам нужно учитывать не только ценности личности. Это в основном любое значение, которое может измениться в базе данных после вставки / обновления, например вычисляемые столбцы, столбцы, на которые влияют триггеры и т. Д.

2 голосов
/ 01 июня 2010

Если вы всегда будете знать номер Id при создании класса, и он никогда не изменится после создания класса, рассмотрите возможность использования модификатора readonly, например:

public class Thing {
    public Thing () : This (ID: 0) {}
    public Thing (int ID) {
        this._ID = ID
    }
    private readonly int _ID;
    public int ID {
        get { return this._ID;};
    }
}

Это заблокирует вас во время компиляции от изменения значения поля _ID после того, как оно было установлено конструктором.

...