2016-07-03 10 views
3

でマスター・ディテールを組み合わせた:Entity Frameworkの、コード-最初:私はコードの最初のEFを使用して、単純な主従関係を持つゼロ対1の関係

public class User 
{ 
    public string Id { get; set; } 
    public ICollection<Tasks> Tasks { get; set; } 
} 

public class Task 
{ 
    public string Id { get; set; } 

    [Required] 
    public string UserId { get; set; } 
    public User User { get; set; } 
} 

今、私は、ユーザーように、それを変更したいです最も重要な単一のタスクを持つことができます。だから私はそれを追加するUserクラスを変更します。

public class User 
{ 
    public string Id { get; set; } 
    public ICollection<Tasks> Tasks { get; set; } 
    public string MostImportantTaskId { get; set; } 

    [ForeignKey("MostImportantTaskId")] 
    public Task MostImportantTask { get; set; } 
} 

私はAdd-Migrationを実行すると、しかし、私は予想外の結果を得ます。 EFは私が望んでいないTasksテーブルにUser_Id列を追加しようとしている、と私はマスター/詳細関係のために必要な外部キーをドロップします

public override void Up() 
{ 
    DropForeignKey("dbo.Tasks", "UserId", "dbo.Users"); 
    AddColumn("dbo.Tasks", "User_Id", c => c.String(maxLength: 128)); 
    AddColumn("dbo.Users", "MostImportantTaskId", c => c.String(maxLength: 128)); 
    CreateIndex("dbo.Tasks", "User_Id"); 
    CreateIndex("dbo.Users", "MostImportantTaskId"); 
    AddForeignKey("dbo.Users", "MostImportantTaskId", "dbo.Tasks", "Id"); 
    AddForeignKey("dbo.Tasks", "User_Id", "dbo.Users", "Id"); 
} 

public override void Down() 
{ 
    // ... 
} 

それでは、どのように私は、マスター・ディテール関係を維持します1つのタスクへの参照をUserクラスに追加しながら、ユーザーとタスクの間で?

答えて

3

これは私が過度に慣れているものではありませんが、あなたが探しているものはInversePropertyと信じています。 UserクラスにはTaskという複数の関係があるため、をTasksコレクションに追加してUserプロパティのTaskにポイントする必要があります。

ですから、あなたが

public override void Up() 
{ 
    AddColumn("dbo.Users", "MostImportantTaskId", c => c.String(maxLength: 128)); 
    CreateIndex("dbo.Users", "MostImportantTaskId"); 
    AddForeignKey("dbo.Users", "MostImportantTaskId", "dbo.Tasks", "Id"); 
} 

public override void Down() 
{ 
    DropForeignKey("dbo.Users", "MostImportantTaskId", "dbo.Tasks"); 
    DropIndex("dbo.Users", new[] { "MostImportantTaskId" }); 
    DropColumn("dbo.Users", "MostImportantTaskId"); 
} 

ベースの後にしているものになりそうだ次のコードが生成されます移行を実行するときに、あなたのUserクラスで

[InverseProperty("User")] 
public ICollection<Task> Tasks { get; set; } 

をこの変更を加えた場合たとえば、entityframeworktutorial.netにあります。

注:あなたのコードでTasksクラスを参照してきたところ、私はそれがTask.

のためのタイプミスだったと仮定しました
関連する問題