实体框架指南
Posted
技术标签:
【中文标题】实体框架指南【英文标题】:Entity Framework Guid 【发布时间】:2010-09-24 20:10:00 【问题描述】:我正在尝试使用 SQL Server 2008 设置实体框架。我正在使用 Guids 作为我表上的键。有没有办法设置它,以便数据库自动生成密钥?我尝试将“RowGuid”设置为 true,并将列的默认值设置为“(newid())”。无论哪种方式,映射类仍然需要我在 C# 端给它一个 Guid。有什么想法吗?
【问题讨论】:
【参考方案1】:Not yet:
17.4.我可以使用服务器生成的 guid 作为我的实体密钥吗?
很遗憾,在 EF 的 v1 中不支持此功能。虽然 SQL Server 可以有一个类型为“uniqueidentifier”的列并将其默认值设置为“newid()”,但在 SQL Server 2000 中没有很好的方法来提取服务器在您当时生成的值做插入。不过,这可以在更新版本的 SQL Server 上完成,因此目的是我们应该找到一种干净的方法来特殊情况下在未来版本的 EF 中支持这种支持,这样它就可以在那些允许它的数据库上得到支持,而不是在其他。目前,解决方法是在客户端(最好在对象的构造函数中)而不是在服务器上生成 guid。
【讨论】:
【参考方案2】:就我个人而言,我认为任何使用 EF 的人都愿意放弃与 SQL Server 2000 的兼容性来获得他们需要的功能。由于必须保持与 SQL Server 2000 的兼容性,似乎我需要在 EF 中做的每一个中途非平凡的事情都不受支持。
什么时候结束!
【讨论】:
【参考方案3】:由于 Guid 是一个结构,因此永远不会传递空值,因此不会启动默认值。您可以考虑使用 nullable Guid: Guid?,尽管这可能会引起本文中提到的头痛:
Nullable GUID
我发现使用新值初始化 Guid 更容易:
private Guid _identifier = Guid.NewGuid();
如果它是现有记录,则在填充对象时将被替换。如果没有,将插入初始化值。
【讨论】:
只要该列未设置为实体键(或实体键的一部分),就可以使用可为空的 guid,在这种情况下,您将收到错误消息。我喜欢初始化建议,尽管如果它识别出该字段属性的 Guid/Key 组合,这似乎应该开箱即用。【参考方案4】:使用 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);
【讨论】:
【参考方案5】:更新:Microsoft 已使用hotfix KB2561001 修复了 VS2010 SP1 的此错误。
【讨论】:
【参考方案6】:部分类中的静态方法怎么样?
public partial class SomeEntity
public static SomeEntity Create()
return new SomeEntity() Id = Guid.NewGuid();
【讨论】:
以上是关于实体框架指南的主要内容,如果未能解决你的问题,请参考以下文章
如何在实体框架中持久保存 MassTransit 状态数据?
1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)文本分类等
1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)文本分类等