2016-04-05 7 views
0

У меня есть модель, которая содержит следующее свойство:Entity Framework не сохранение данных

public Guid UniqueID 
{ 
    get { return Guid.NewGuid(); } 
} 

Если я исследую объект после того, как он будет создан, я могу видеть, что новые справы правильно созданы для UniqueID поля.

Однако, когда я звоню db.SaveChanges(), я получаю сообщение об ошибке от Entity Framework, заявляя, что он не может вставить NULL в это поле, несмотря на наличие значения.

Любые идеи?

EDIT

private Guid _uniqueID = Guid.NewGuid(); 
public Guid UniqueID 
{ 
    get 
    { 
     if(_uniqueID == null){ 
      _uniqueID = Guid.NewGuid(); 
     } 
     return _uniqueID; 
    } 
    set 
    { 
     _uniqueID = value; 
    } 
} 
+1

Вы действительно хотите получить новый идентификатор GUID _every time you access property_? –

+1

Да, поскольку на данный момент существует проблема с дублированными объектами в базу данных, которые мы в настоящее время пытаемся диагностировать и исправлять, но необходимо временное обходное решение. Это лучший способ гарантировать, что записи уникальны для временной ситуации, такой как наш. – DaRoGa

+2

ID для объекта не должен меняться. Если вам нужен новый идентификатор для каждого объекта, создайте приватное поле, которое будет инициализировано новым значением GUID. Получение нового идентификатора каждый раз, когда вы получаете доступ к свойству, очень странно и может вызвать поведение, которое вы испытываете. –

ответ

1

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

private Guid _uniqueID = Guid.NewGuid(); 
public Guid UniqueID 
{ 
    get 
    { 
     return _uniqueID; 
    } 
    private set 
    { 
     _uniqueID = value; 
    } 
} 

Заметьте, что это немного отличается от вашего редактирования. Я сделал сеттер private и вынул if(_uniqueID == null), так как Guid является типом значения и никогда не может быть нулевым.