2010-04-05 6 views
2

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

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 в настоящее время доступны только моему веб-приложению.

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

ответ

1

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

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

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

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

int newEntityID = newEntity.ID; 

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

+0

Я еще не создал БД. Как отразить это поведение в модульном тесте метода Add() в репозитории? –

+0

@ Томас: если вам нужно высмеять это, вам нужно установить поле идентификатора в допустимое значение, когда вызывается .SaveChanges() –

+0

@marc: Как вы видите в методе добавления выше, на самом деле у меня нет звоните в SaveChanges().Означает ли это, что невозможно вернуть новый идентификатор? –

0

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

+1

Тем не менее, я хотел бы использовать 'int's для идентификатора, чтобы иметь возможность использовать их в URL, не теряя столько читаемость. –