我有以下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列自动生成但同时不是主键的一部分?
答案 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");
}
}
然后更新数据库。
似乎对我有用。