質問: 私は制御できないモデルを使用しています。これをSQLデータベースに保存しています。 私はこのモデルの属性に主キーを追加するためにFluent APIを使用しています ``` modelBuilder.Entity().HasKey(d => d.DocumentId); ``` `Message`は次のようになります。 ``` [Required] public Guid DocumentId { get; set; } [Required] public int Size { get; set; } public string SenderId { get; set; } ``` しかし、同じ`DocumentId`持つ2つの`Message`を受け取ることは完全に可能です。通常、 `[DatabaseGenerated(DatabaseGeneratedOption.Identity)]`ようなものを使用して保存するときに、SQLに一意の識別子を追加させますが、 `Message`を制御できないため、これをどのように処理すればよいですか どんなヒントでも大歓迎です。
回答: 幸いなことにEF Coreでは、 ShadowプロパティをPKとして定義して使用することができます。 たとえば、次の流暢な設定は "Id"という名前のID列を作成し、それをPKとして使用します。 ``` modelBuilder.Entity() .Property("Id") .ValueGeneratedOnAdd(); modelBuilder.Entity() .HasKey("Id"); ``` この場合の`ValueGeneratedOnAdd`と`HasKey`は冗長です。なぜなら、慣例では "Id"という名前のプロパティはPKで、慣習では`int`型のPKは自動生成されるからです。 ただし、シャドウPKを使用するのは難しくなります。追加は簡単ですが、読み取り、更新、および削除操作には問題があります。 `EF.Property`メソッドは、シャドウPKを参照するためにLINQクエリ内で使用できますが、一般に、レコードを更新または削除したい場合には、いくつかの2次基準が必要になります。