使用不属于主键的自动生成的UNIQUEIDENTIFIER

时间:2014-05-21 11:48:40

标签: c# sql .net sql-server entity-framework

我有以下EF代码优先实体及其相应的配置:

public class Category
{
    public virtual long Id { get; set; }
    public Guid Guid { get; set; }
    public string Name { get; set; }
}

public class CategoryConfiguration:
    EntityTypeConfiguration<Category>
{
    public CategoryConfiguration ()
    {
        this.HasKey(entity => entity.Id);
        this.Property(entity => entity.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        this.Property(entity => entity.Guid).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }
}

在字段DatabaseGeneratedOption.Identity上设置Guid选项似乎没有任何效果,并且SQL Server中的相应表禁用了IDENTITY选项。

有没有办法让EF中的GUID / UNIQUEIDENTIFIER列自动生成但同时不是主键的一部分?

3 个答案:

答案 0 :(得分:1)

EF不会“自动生成”与ID相关的任何内容,这些内容全部由数据库处理。此外DatabaseGeneratedOption.Identity与主键无关,它只是EF的一个指示,即字段值由DB生成,因此应下拉。

只要您的字段数据库中的默认值设置为newid()newsequentialid(),那么DatabaseGeneratedOption.Identity应该有效。

答案 1 :(得分:0)

黑客......

public calss Guid1 {
    public Guid Guid { get; set; }
}

public class Category {
    public virtual long Id { get; set; }
    public Guid1 Guid { get; set; }
    public string Name { get; set; }
}

public class CategoryConfiguration:EntityTypeConfiguration<Category> {
    public CategoryConfiguration () {
        HasKey(entity => entity.Id);
        Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        HasReqired(x => x.Guid1);
    }
}

public class Guid1Configuration:EntityTypeConfiguration<Guid1> {
    public Guid1Configuration () {
        HasKey(x => x.Guid);
        Property(x => x.Guid).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }
}

这应该可行,但你会得到一个无用的表Guid1。

答案 2 :(得分:0)

为了使用EntityFramworkCore(.NET核心)的搜索者的利益,您可以执行以下操作:

EF模型(通知创建时设置的默认值)

public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }

        public Guid BlogGuid { get; set; } = Guid.NewGuid();

        public List<Post> Posts { get; set; }
    }

创建迁移,然后将默认值更改为defaultValueSql:“newid()”:

public partial class BlogGuidTest : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<Guid>(
                name: "BlogGuid",
                table: "Blogs",
                nullable: false,
                defaultValueSql: "newid()");

            // Add contraint to be safe
            migrationBuilder.AddUniqueConstraint("BlogGuid_Unique", "Blogs", "BlogGuid");
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropUniqueConstraint("BlogGuid_Unique", "Blogs");

            migrationBuilder.DropColumn(
                name: "BlogGuid",
                table: "Blogs");
        }
    }

然后更新数据库。

似乎对我有用。