Должен ли я использовать обнуляемые типы для идентификаторов на моих объектах сущности? - PullRequest
2 голосов
/ 05 апреля 2010

Моя текущая настройка :
У меня есть объект сущности с некоторыми свойствами, среди которых int Id. Для связи с базой данных я создал репозиторий, в частности, следующим методом:

public int Add(TEntity entity)
{
    ObjectSet.AddObject(entity);
    return entity.Id;
}

(Это универсальный репозиторий, который требует, чтобы TEntity был class, и чтобы он реализовал IEntity, который является просто интерфейсом со свойством int Id.)

Моя проблема:
Теперь, когда я хочу создать новый объект для добавления в репозиторий, мне нужно дать ему идентификатор. Однако это не позволяет EF автоматически генерировать идентификатор для меня, поскольку он уже будет иметь значение.

Возможные решения:
Я мог думать только об этих двух возможностях.

  1. Сделать свойство Id обнуляемым
  2. Вместо этого передайте EntryInputModel в хранилище, а затем выполните сопоставление там.
    В настоящее время я привязываюсь к EntryInputModel в моем контроллере и сопоставляю его с Entry, используя AutoMapper . Если мне нужно изменить это, мне также нужно переосмыслить зависимости в моем проекте, поскольку классы ...InputModel и ...ViewModel в настоящее время доступны только для моего веб-приложения.

Что предпочтительнее? Есть ли еще способы противостоять этому?

Ответы [ 2 ]

1 голос
/ 05 апреля 2010

Если вы используете SQL Server в качестве бэкэнда, я рекомендовал бы сделать столбец идентификатора INT IDENTITY в базе данных и столбец без значения NULL в вашем объектном объекте.

При добавлении новой сущности присвойте ID какое-то произвольное значение, например, -1 или что-то, или вообще никакого значения, даже. Фактический идентификатор будет автоматически сгенерирован SQL Server при вставке нового объекта (

EntityContext.AddToEntities(newEntity);
EntityContext.SaveChanges();

, и он будет автоматически передан обратно в EF, так что вы сможете сразу использовать его, как только он будет вставлен:

int newEntityID = newEntity.ID;

Работает как шарм - по крайней мере, в моих тестовых приложениях: -)

0 голосов
/ 05 апреля 2010

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

...