4

を定義しているにもかかわらず、Id列を作成します。Entity Frameworkの6他のプライマリキーは、私はとのDataObjectを定義し

public class SensorType : EntityData 
{ 
    //PKs 
    public string CompanyId { get; set; } 
    public string ServiceId { get; set; } 

    public string Type { get; set; } 
} 

そしてたCompanyIdを作るために流暢なAPIを使用して複合キーをServiceID:でも

modelBuilder.Entity<SensorType>() 
      .HasKey(t => new { t.CompanyId, t.ServiceId }); 

//No autogeneration of PKs 
modelBuilder.Entity<SensorType>().Property(t => t.ServiceId) 
      .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); 
modelBuilder.Entity<SensorType>().Property(t => t.CompanyId) 
      .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); 

を主キーが設定されているにもかかわらず、Entity FrameworkはAdd-Migrationを実行するとIDという列を作成します。

CreateTable(
      "dbo.SensorTypes", 
      c => new 
       { 
        CompanyId = c.String(nullable: false, maxLength: 128), 
        ServiceId = c.String(nullable: false, maxLength: 128), 
        Type = c.String(), 
        Id = c.String(
         annotations: new Dictionary<string, AnnotationValues> 
         { 
          { 
           "ServiceTableColumn", 
           new AnnotationValues(oldValue: null, newValue: "Id") 

        ... 
       }) 
      .PrimaryKey(t => new { t.CompanyId, t.ServiceId }) 
      .Index(t => t.CreatedAt, clustered: true); 

    } 

EFがこの列を追加しないようにするにはどうすればよいですか?ドキュメントの

+1

意図的に両方のフィールドの組み合わせを複合キーとして使用しようとしていますか?もしそうなら、本当に良い理由はありますか? – Basic

+0

エンティティフレームワークにDatabaseGeneratedOptionについて通知する必要はありません。なし、ちょうど会社とサービステーブルとの関係を設定します – Monah

+1

EntityDataのコードを入れて、EntityデータにIdが含まれていると思われます。これがプライマリキーとなる理由です。 – Monah

答えて

2

私はそれはとは何かを持っている疑いがありますEntityDataEntityDataからクラスを派生しているという事実には、Idというプロパティがあります。私の推測では、EFはキー命名規則(すなわち、Id)と明示的に定義された鍵を守っているプロパティがあるため、混乱しています。

Idを明示的に無視するように指示する必要があると思われます。

MSDN: EntityData Class

UPDATE:私はあなたがこのためのAzureで作業していると仮定してい

。このSO questionには、最適な解決策を見つけるのに役立ついくつかの追加情報があります。

しかし、私はあなたの質問に対する彼のコメントで@Basicに同意します。私は、一般的に、彼らが導入する複雑さ(および他の問題)のために、EFとの複合キーを恥ずかしがります。私はあなたのCompanyIdServiceIdフィールドのユニークな制約が、SensorTypeのプライマリキーにそれらを関与させずに、あなたが望むものを達成すると思っています。つまり、派生したIdプロパティをプライマリキーとして使用して、問題全体を一括して回避することもできます。あなたの実装には実現可能かどうかは分かりませんが、考慮する必要があります。

+0

今のケースは明確で、EntityDataのIdもIdとして生成されます。流暢なAPIに無視するよう伝えることもできますし、SensorTypeをEntityDataから継承させることもできません。 – Monah

+0

Ignoring Id worked!しかし、それはリブスコフの代用原則に違反している。 EFを使用し、EntityDataから継承せずにコントローラを生成することはできますか?それは提供します:CreatedAt、UpdatedAt、ect。そしてもちろんId。 –

+0

@Emilこれに関するいくつかのアイデアについては、アップデートを参照してください。 –

-1

参照テキスト:

Entity Frameworkのは、それが実体を追跡するために使用するキー値を持つすべてのエンティティに依存しています。コードが最初に従う規則の1つは、各コードの最初のクラスのどのキーがどのようなキーであるかを示す方法です。この規約では、 "Id"という名前のプロパティ、または "BlogId"などのクラス名と "Id"を組み合わせたプロパティを検索します。プロパティは、データベースの主キー列にマップされます。

異なるキーを使用するには、注釈、[キー]を使用する必要があり、例:

[Key] 
public int primaryKey { get; set; } 

Documentation Oficial

Tutorial Link

関連する問題