2012-06-21 4 views
3

В моей службе WCF Я использую Entity Framework .NET 4.0, в моей базе данных у меня есть эта таблица:EntityFramework заселение UniqueIdentifier со значением "00000000-0000-0000-0000-000000000000"

CREATE TABLE [dbo].[Tracking](
    [TrackingID] [uniqueidentifier] ROWGUIDCOL NOT NULL, 
    ... 
CONSTRAINT [PK_Tracking] PRIMARY KEY CLUSTERED 
(
    [TrackingID] ASC 
) 
) ON [DATA] 
ALTER TABLE [dbo].[Tracking] ADD CONSTRAINT [DF_Tracking_TrackingID] DEFAULT (newid()) FOR [TrackingID] 
GO 

, когда я вставить запись. Объект framewrok предварительно заполнил TrackingID как «00000000-0000-0000-0000-000000000000». Я установка поля свойства быть вычислены и Идентичность бушеля нет такой удачи любых идей: вот мой фрагмент коды:

using (var context = new DB.PTLEntities()) 
{ 
    var tracking = new DB.Tracking();  
    context.Trackings.AddObject(tracking); 
    context.SaveChanges(); 
    trackingID = tracking.TrackingID; 
} 

ответ

3

Похоже, EF не думает этот столбец является столбцом идентификаторов поэтому его ввода в неплатеже (Guid). Посмотрите здесь некоторые подробности о внесении в Guid столбец идентификаторов (это на самом деле проходит через ваш точный пример) http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

+2

Ссылка сломана. Кэш Google: http://goo.gl/kOQs7e – sennett

+1

Кэш тоже сломан ... – oxfn

+1

@oxfn попробуйте машину обратного пути: http://web.archive.org/web/20120215161924/http://leedumond.com/ blog/use-a-guid-as-an-entitykey-in-entity-framework-4 его позор, его блог отключен, я мог бы вытащить часть этого в мой ответ на каком-то этапе –

0

В моем случае (EF> = 4,1) Мне нужно добавить по умолчанию в самой таблице:

ALTER TABLE MyTable ADD DEFAULT (newid()) FOR [Id] 

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

public class ShedContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<DraftFromWebOneOff>() 
      .Property(d => d.Id) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

     base.OnModelCreating(modelBuilder); 
    } 
} 
+0

Ваш ответ про EF> = 4.1 – oxfn

+0

@oxfn thanks. изм. – sennett

0

я получил такой же вопрос. Следующее решение сработало для меня.

Необходимо изменить значение StoreGeneratedPattern для свойства в дизайнере EF. Установите его на Identity. Это заставит EF избежать установки значения на вставке, а затем захватить его после завершения вставки.

Если ваша версия EF равна 4, у вас могут возникнуть проблемы с этим использованием только дизайнера. Возможно, вам придется вручную отредактировать файл .edmx и установить StoreGeneratedPattern в самой модели хранилища.

Пример:

< Property Name="EmpId" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Identity" /> 
Смежные вопросы