2017-11-07 17 views
0

.NET EFからEF COREに移行しています。私は主キーとは別のGUIDを自動的に生成する実用的なソリューションを持っています。以下はその解決策です。EFコア - プライマリキーではない一意の索引付き自動生成GUID列

[Key, Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    [Index(IsUnique = true)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid TenantId { get; set; } 

私はEFコアに移行しようとしたときにデータを挿入するときしかし、私はエラーメッセージを取得しています:> SqlExceptionが:列' TenantId 'にNULL値を挿入することはできません、テーブル' DBContext.dbo.Tenants ';列はNULLを許可しません。 INSERTは失敗します。 ステートメントが終了しました。

は、ここに私の新しいコードです:

[Key, Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public Guid TenantId { get; set; } 

流暢:

base.OnModelCreating(builder); 
    builder.Entity<Tenant>() 
    .HasIndex(t => t.TenantId) 
    .IsUnique(); 
    builder.Entity<Tenant>() 
    .Property(t => t.TenantId) 
    .ValueGeneratedOnAdd(); 

これは、使用して挿入されます。

  _context.Tenants.Add(tenant); 
     await _context.SaveChangesAsync(); 

はEFコアによってサポートされており、必要とされていません。このものです回避策?

+0

生成される一意のGUIDはどのように生成されますか?あなたの設定では、EFCはそれがデータベース(列 'DEFAULT 'など)で提供されることを期待しています。 –

+0

.NET Frameworkのバージョンでは、データベースによって自動的に生成されます。この 'ValueGeneratedOnAdd()'は生成しませんか? –

+0

代わりに 'HasDefaultValueSql(" NEWID() ")'が必要だと思います。 –

答えて

0

新しいコードには、[DatabaseGenerated(DatabaseGeneratedOption.Identity)]注釈はありません。あなたのコードは次のとおりです:

[Key, Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int Id { get; set; } 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid TenantId { get; set; } 
+0

'builder.Entity () // .Property(t => t.TenantId) //ValueGeneratedOnAdd();'を追加しても同じではありませんか?私は前にそれを試しました、それは同じエラーを生成します。 –

+0

これもチェックしてくださいhttps://stackoverflow.com/a/27159150/1777623 – Kostis

+0

OK、この変更がデータベースに反映されるように、最初からマイグレーション全体を再作成する必要があります。 –

関連する問題