5

在我的 WCF 服务中,我使用的是 Entity Framework .NET 4.0,在我的数据库中,我有这个表:

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

当我插入记录时,实体框架已将 TrackingID 预填充为“00000000-0000-0000-0000-000000000000”。我已将字段属性设置为 Computed 和 Identity,但没有任何想法:这是我的代码片段:

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

3 回答 3

5

看起来 EF 不认为该列是标识列,因此将其放入默认值(Guid)。在这里查看有关使 guid 成为身份列的一些详细信息(它实际上通过您的确切示例)http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework -4/

于 2012-06-21T21:41:51.800 回答
1

我有同样的问题。以下解决方案对我有用。

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

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

例子:

< Property Name="EmpId" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Identity" />
于 2017-11-29T06:46:42.870 回答
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);
    }
}
于 2013-08-13T03:56:31.733 回答