C# 实体框架Guid

C# 实体框架Guid,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我正在尝试使用SQLServer2008设置实体框架。我正在使用guid作为表上的键。有没有办法设置它,以便数据库自动生成密钥?我尝试将“RowGuid”设置为true,并将列的默认值设置为“(newid())”。无论哪种方式,映射类仍然需要我在C#端给它一个Guid。有什么想法吗?因为Guid是一种结构,所以不会传递空值,所以默认值不会生效。你可以考虑一个:GUID,尽管这可能会引起这个帖子中提到的头疼: 我发现使用新值初始化Guid更容易: private Guid _identifier

我正在尝试使用SQLServer2008设置实体框架。我正在使用guid作为表上的键。有没有办法设置它,以便数据库自动生成密钥?我尝试将“RowGuid”设置为true,并将列的默认值设置为“(newid())”。无论哪种方式,映射类仍然需要我在C#端给它一个Guid。有什么想法吗?

因为Guid是一种结构,所以不会传递空值,所以默认值不会生效。你可以考虑一个:GUID,尽管这可能会引起这个帖子中提到的头疼:

我发现使用新值初始化Guid更容易:

private Guid _identifier = Guid.NewGuid();
如果它是现有记录,则在填充对象时将替换它。否则,将插入初始化值

17.4.我可以使用服务器生成的guid作为实体密钥吗?

不幸的是,在EF的v1中,这是不受支持的。虽然SQL Server可以有一个类型为“uniqueidentifier”的列,并将其默认值设置为“newid()”,但SQL Server 2000无法提取服务器在执行插入时生成的值。不过,这可以在SQL Server的较新版本上实现,因此我们的目的是,在EF的未来版本中,我们应该找到一种干净的方法来支持这种特殊情况,以便在允许它的数据库上支持它,而不是在其他数据库上。目前,解决方法是在客户端(理想情况下是在对象的构造函数中)而不是在服务器上生成guid


我个人认为,任何使用EF的人都愿意放弃与SQLServer2000的兼容性,以获得他们需要的功能。似乎我在EF中需要做的每一件半途而废的事情都是不受支持的,因为它们必须保持与SQL Server 2000的兼容性

什么时候才能结束

使用v4更容易

比必须更改edmx更好的方法是我下面的代码,它将为您生成Guid。它检查主键并反射设置主键

警告-假定只有一个Guid主键,并且由于您自己的原因没有设置它

void OgaraEntities_SavingChanges(object sender, EventArgs e)
{
  foreach (ObjectStateEntry entry in
      ((ObjectContext)sender).ObjectStateManager.GetObjectStateEntries(
      EntityState.Added ))
  {
    if (!entry.IsRelationship){
      string keyFieldName = entry.EntitySet.ElementType.KeyMembers[0].Name;
      object entity = entry.Entity;
      PropertyInfo pi = entity.GetType().GetProperty(keyFieldName);
      pi.SetValue(entity, Guid.NewGuid(), null);
    }
  }      
}

更新:Microsoft已通过修复VS2010 SP1的此错误。

部分类中的静态方法如何

public partial class SomeEntity
{
     public static SomeEntity Create()
     {
         return new SomeEntity() { Id = Guid.NewGuid(); }
     }
}

只要该列未设置为实体键(或实体键的一部分),使用可为空的guid就可以工作,在这种情况下,将出现错误。我喜欢初始化建议,尽管如果它识别出该字段属性的Guid/键组合,那么这似乎应该是开箱即用的。