2017-07-28 18 views
0

コードを使用まず、Donorを表すモデルを作成しました。私はすべてのDonorオブジェクトを格納するテーブルを生成するために移行を使用しました。私は注釈を使用して、私のモデルの2つのプロパティー、すなわちNameTeamIdの複合である主キーを指定しました。Entity Frameworkコードファーストプライベートキーの一部として外部キーを使用

HourlySnapshotsというモデルにナビゲーションプロパティを追加しました。これは、1対多の関係を表すICollection<HourlySnapshot>です。 (HourlySnapshotは私が作成した別のドメインモデルです)。マイグレーションを実行し、HourlySnapshotオブジェクトをすべて格納する別のテーブルを生成しました。期待通りに、それはNameTeamIdで構成される外部キーを格納する私のモデルになかった2つの列を追加しました。

HourlySnapshotsテーブルを初期化するために、プライマリキーとして使用されるオブジェクトに従来のIdプロパティを追加しました。私がしようとしているのは、Id列の外部キー(NameTeamIdのコンポジット)とTimestampと呼ばれるHourlySnapshotという別のプロパティのコンビネーションに、HourlySnapshotsテーブルの主キーを切り替えることです。つまり、3つの列Name,TeamId、およびTimestampの複合体にします。

コードファーストでこれを行う方法はありますか?私はテーブル定義を開いてそこで編集することで簡単にこれを行うことができますが、コード・ファーストのワークフローを遵守して、すべての変更がマイグレーションに含まれるようにしたいと思います。

+0

あなたがモデルコードを含んでいれば、人々が手助けしやすくなります。次に、[サロゲートキー](https://en.wikipedia.org/wiki/Surrogate_key)を使用すると、これがはるかに簡単になります。しかし、自然キーが必要な場合は、[annotations](https://msdn.microsoft.com/en-us/library/jj591583(v=11113).aspx)または[fluently](を介してEFで複合キーを指定することができますhttps://msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx)。 –

答えて

0

もう少し研究を重ねた結果、Fluent APIでこれを達成できました。注釈や慣習を使用することはできないと思います。ここで私がApplicationDBContextクラスで終わったのは...

public DbSet<Donor> Donors { get; set; } 
public DbSet<HourlySnapshot> HourlySnapshots { get; set; } 
public DbSet<DailySnapshot> DailySnapshots { get; set; } 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Donor>() 
     .HasKey(d => new { d.Name, d.TeamId }); 

    modelBuilder.Entity<HourlySnapshot>() 
     .HasKey(s => new { s.Name, s.TeamId, s.Timestamp }); 

    modelBuilder.Entity<Donor>() 
     .HasMany(d => d.HourlySnapshots) 
     .WithOptional() 
     .HasForeignKey(s => new { s.Name, s.TeamId }); 

    modelBuilder.Entity<DailySnapshot>() 
     .HasKey(s => new { s.Name, s.TeamId, s.TimeStamp }); 

    modelBuilder.Entity<Donor>() 
     .HasMany(d => d.DailySnapshots) 
     .WithOptional() 
     .HasForeignKey(s => new { s.Name, s.TeamId }); 

    base.OnModelCreating(modelBuilder); 
} 
関連する問題