2012-06-21 30 views
3

在我的WCF服务我使用实体框架.NET 4.0, 在我的数据库,我有这个表:的EntityFramework填充唯一标识符与价值“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”。我已经设置字段属性进行计算和身份BU没有这样的运气任何想法:这里是我的代码片段:

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尝试wayback机器:http://web.archive.org/web/20120215161924/http://leedumond.com/博客/使用一个GUID作为一个实体key-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谢谢。编辑。 – sennett

0

我有同样的问题。以下解决方案为我工作。

有必要更改EF设计器中属性的StoreGeneratedPattern值。将其设置为Identity。这将导致EF避免设置插入值,然后在插入完成后捕获它。

如果您的EF版本是4,那么您可能在使用设计器时遇到问题。您可能必须手动编辑.edmx,并在存储模型本身中设置StoreGeneratedPattern

实施例:

< Property Name="EmpId" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Identity" />