2016-09-26 10 views
1

私はEntity Framework 6.1を使用して、データベースの最初のアプローチでアプリケーションを構築しようとしています。1つのプロパティをエンティティフレームワークとの複数のリレーションにマップするにはどうすればよいですか?

ローカルのプロパティとしてデフォルトKeyという別名Idを使用しないで、1対多の関係を構築する方法に困惑しています。

私は、以下の二つのモデルを持ってここで最初の

public class UserToClient 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [ForeignKey("ViewClient")] 
    public int ClientId { get; set; } 

    [ForeignKey("Team")] 
    public int DefaultTeamId { get; set; } 

    public bool IsActive { get; set; } 

    public virtual ViewClient ViewClient { get; set; } 
    public virtual Team Team { get; set; } 

    public virtual ICollection<Team> Teams { get; set; } 

} 

は私UserToClientモデルの中で私の2番目のモデル

public class Team 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public bool IsActive { get; set; } 

    public string Name { get; set; } 

    [ForeignKey("ViewClient")] 
    public int ClientId { get; set; } 

    public virtual ICollection<ViewClient> ViewClients { get; set; } 

    public virtual UserToClient UserToClient { get; set; } 

} 

で、私は1対多の関係を作成したい「ワンUserToClientました多くTeam "

最終結果では、このようなことをしたいです

using(var connection = new AppContext()) 
{ 
    var userToClients = connection.UserToClients 
           .Include(x => x.Team) 
           .Include(x => x.Teams) 
           .ToList(); 


    //Do something with userToClients 

    //Do something with userToClients.Team 

    //Do something with each team 

    foreach(var team in userToClients.Teams) 
    { 
     //Do something with 'team' 
    } 
} 

私は「エンティティの外」手動でクエリを記述した場合、私はこの

SELECT * 
FROM [UserToClient] AS r 
LEFT JOIN [Team] AS t ON t.ClientId = r.ClientId 

ような何かを行うことになる問題

関係はClientIdないというプロパティを指すように必要主キーId

エンティティは現在このようなクエリを生成しており、IdからClientIdに変更することができます。

SELECT * 
FROM [UserToClient] AS r 
LEFT JOIN [Team] AS t ON t.Id = r.ClientId 

Idが主キーであることを理解することが重要であるが、この場合には、私は主要なものではありませんキーで参加したいです。

この問題を解決するにはどうすればよいですか?私はこの

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Team>() 

       .HasRequired(x => x.UserToClient) 
       .WithMany(x => x.Teams) 
       .HasForeignKey(f => f.ClientId); 

} 

のようなコンテキストクラスでOnModelCreatingメソッドをオーバーライドすることで、この問題を解決しようと

試み

私は地元のproperyはClientIdであるという関係を伝える方法を必要とし、 not Id

どうすれば修正できますか?

答えて

0

私は、この種の関係を指定するためにFluent APIも使用する必要があると考えています。回答と同様の質問がありますhere

+0

私はデータベースの最初のアプローチを使用しています。しかし、私は自分のモデルを書くことを選んで、自動生成されたコードの周りを減らします。どうすればいい? – Jaylen

+0

私が掲示した例は、コードの最初のモデルです。 Fluent APIを使用して、 'DbContext.OnModelCreating(DbModelBuilder)'関数でリレーションを指定します – Bwolfing

関連する問題