实体框架:使用GUID作为主键

时间:2015-01-14 16:52:48

标签: .net entity-framework ef-model-first

我想将GUID实现为模型中的主键。我使用模型优先方法,我希望GUID不是在数据库中生成,而是在.NET服务器中生成。

我见过一个解决方案,说我必须为每个班级做这个:

public class TestObject 
{
    public TestObject() 
    {
        Id = Guid.NewGuid();
    }

    public Guid Id { get; set; }
}

问题在于:我不认为这是一个干净的解决方案,将其应用于我所拥有的每个班级。

我没有 POCO类,因为我使用的是模型优先。

那么,我该怎么办?这是最好的方法,你觉得呢?有什么建议吗?

2 个答案:

答案 0 :(得分:0)

在这种情况下,为了独立于任何其他考虑回答问题,您应该:

  • 覆盖SaveChanges方法
  • 寻找已添加的实体
  • 设置他们的ID。

如果您的类实现了诸如

之类的接口
interface {
    Guid Id {get; set;}
}

您的任务将变得更加轻松。

答案 1 :(得分:0)

由于您的所有实体似乎都有Id作为主键,最明显的是修改t4模板,因此会生成guid初始化。

在用于实体生成的当前t4模板(类似ModelName.tt)中,构造函数生成以...开头。

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public <#=code.Escape(entity)#>()
    {
<#
        foreach (var edmProperty in propertiesWithDefaultValues)

(在我的模板中,它从第37行开始)

将此更改为......

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public <#=code.Escape(entity)#>()
    {
                this.Id = Guid.NewGuid();
<#
        foreach (var edmProperty in propertiesWithDefaultValues)