2016-07-04 3 views
1

Поскольку первичный ключ PassageId будет создан автоматически и не может быть изменен, выставление установщика PassageId не имеет смысла (по крайней мере для меня). Должен ли установщик PassageId быть закрытым?Должен ли настройщик свойства для класса модели объекта быть закрытым?

public class Passage 
{ 
    public int PassageId { get; private set; } 
    public string Contents { get; set; } 

    public DateTime CreatedUtc { get; private set; } 
    public DateTime ModifiedUtc { get; private set; } 
} 

Примечание

Большинство учебников я читал, авторы всегда используют свойство по умолчанию, сгенерированное ярлыком Visual Studio, prop ввести (дважды) продуцирующее что-то вроде

public type PropertyName {get; set;} 

Так мне интересно, почему они не сделал сеттера закрытым.

+0

После запуска вставки идентификатор обновляется в локальной модели. Он не мог этого сделать без доступа к нему. Ты пробовал? – Crowcoder

+0

@Crowcoder: Спасибо за ваш комментарий. Я сделаю попытку. –

+0

Да, но не всегда. Это зависит от того, как вы планируете контролировать свои идентификаторы в базе данных. Если вы не отмечаете этот столбец как столбец Identity, вам может потребоваться контроль над вставкой вашего собственного идентификатора (например, GUID). – RizJa

ответ

1

Это потому, что обычно (с точки зрения дизайна) объект является объектом, который вы передадите для отображения данных или обновления.

Следовательно, при создании экземпляра объекта необходимо заполнить данные данными из хранилища (или с помощью ввода уровня представления).

E.g. Person person = PersonService.GetById(personId);

Учитывая, что PersonService обращается к инфраструктуре Entity Framework и находит одиночную запись Person, где Id соответствует personId, она затем заполняет этот объект «person» с полученными значениями.

Для того чтобы Entity Framework заполнила объект, поля должны быть общедоступными.

Если с помощью ввода кода или пользователя имя человека изменено, идентификатор будет использоваться для метода SaveChanges() для обновления.

При проверке свойств хозяйствующего субъекта:

Если Id = 0, то это будет рассматриваться как новое юридическое лицо и должно быть «Добавлено» для хранения на SaveChanges().

Если идентификатор> 0, то он должен быть обновлен в SaveChanges().

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

+0

Я не понимаю, зачем вам вручную устанавливать 'Id', пока он будет автоматически сгенерирован СУБД? –

+0

Вам не нужно: Entity Framework заполняет Id из того, который он извлекает из хранилища. Но он не сможет, если у вас есть только частный сеттер. –

+0

Хм ... Я думал, что структура имеет полный доступ даже к частным членам.Но, зная, что EF также является клиентом нашей модели, принцип инкапсуляции (например, скрытие некоторых членов для других клиентов) становится невозможным. Похоже, что EF не заставляет нас строго придерживаться принципа инкапсуляции. –

Смежные вопросы