繁体   English   中英

实体框架指导

[英]Entity Framework Guid

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

还没有

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

不幸的是,在EF的v1中,这不受支持。 虽然SQL Server可以使用“uniqueidentifier”类型的列并将其默认值设置为“newid()”,但使用SQL Server 2000时,没有什么好方法可以提取服务器在您生成时生成的值做插入。 但是,这可以在更新版本的SQL Server上完成,因此我们应该在EF的未来版本中找到一种特殊情况下这种支持的简洁方法,以便在允许它而不是它的那些数据库上支持它。其他。 目前,解决方法是在客户端(最好是在对象的构造函数中)而不是在服务器上生成guid。

就个人而言,我认为任何使用EF的人都愿意放弃与SQL Server 2000的兼容性来获得他们需要的功能。 看起来我需要在EF中执行的每个非常重要的事情都不受支持,因为他们必须保持与SQL Server 2000的兼容性。

什么时候结束!

由于Guid是一个结构,因此永远不会传递空值,因此默认值不会启动。你可以考虑一个可以为空的Guid :Guid ?,虽然这可能会引起头痛,如本文所述:

可以为空的GUID

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

private Guid _identifier = Guid.NewGuid();

如果它是现有记录,则在填充对象时将替换它。 如果不是,则插入初始化值。

使用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的此错误, 修复程序为KB2561001

部分类中的静态方法怎么样?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM