2016-04-17 8 views
1

私は2つのクラスを持っています。最初のものはこれです:エンティティフレームワークのコードを最初に:どのように "プリンシパル"と同じIDの概念を使用しない1対1の関係を設定するには?

public class User 
{ 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string Name { get; set; } 
    public DateTime Birth { get; set; } 
    public Sex Sex { get; set; } 
    public List<Album> Albums { get; set; } 
    public DateTime Created { get; set; } 

    public Picture ProfilePicture { get; set; } 
} 

そしてもう一つはこれです:

public class Picture 
{ 
    public int Id { get; set; } 
    public Album Album { get; set; } 
    public string Path { get; set; } 
    public string Description { get; set; } 
    public DateTime Created { get; set; } 

    public User User { get; set; } 
} 

写真をテーブルに保存されている、と彼は内部のアルバムを好きなユーザーは、できるだけ多くの画像を持つことができ、それらはアルバムを使ってアクセスする。ここでAlbumクラスがあります:

Pictureオブジェクトを持つ
public class Album 
{ 
    public int Id { get; set; } 
    public User User { get; set; } 
    public AlbumType Type { get; set; } 
    public List<Picture> Pictures { get; set; } 
    public string Name { get; set; } 
    public DateTime Created { get; set; } 
} 

、私は現在、作品picture.Userようなことを、やって、その絵のUser所有者を取得することができるようにしたいです。しかし、それらの写真の1つだけがプロフィール画像になります。プロフィールの写真はほとんど常に取得されているので、私はこのようなコードを何かに行うことができるようにしたいと思います:

LoadPicture(user.ProfilePicture.Id); 

私の問題は、EFは、私はI 1対1の関係を作成したいと考えていることですプリンシパルを定義しなければならず、両方のエンティティは同じIDを持つ必要があります。 Pictureのエンティティは独自のIDを持っていなければなりません。Userも独自のIDを持っている必要があります。それをEFにどうすればいいのですか?user.ProfilePicture.Idはどうですか?

ご協力いただければ幸いです。

+0

データベースモデルを変更できないことを正しく理解していますか? –

+0

@GertArnoldこれは変更できます。アイデアは、ユーザーのレコードに自分のプロフィール画像のIDを書き込み、コードでは、 'user.ProfilePicture'のようなコード行で画像オブジェクトを取得できるようにすることです。言い換えれば、ピクチャテーブルに 'User'というIDを持つ外部キーの代わりに' Picture'のIDを持つ外部キーがuserテーブルにあり、 'user.ProfilePicture'を書くことができるはずです。私は最初にコードでそれを行う方法を知らない。多分それはできないかもしれません。ちょうどEFで、たぶん、そうですが、コードでは最初はおそらくいいでしょう。 – amedina

答えて

2

Pictureオブジェクトを持つことで、picture.Userのような、現在動作している画像のUser所有者を取得できます。

それは誤解を招くようなので、私はUserプロパティを削除または名前変更のいずれかあなたを示唆している - このプロパティは本当にUser.ProfilePictureの逆を表しながら、絵の所有者は、Picture.Album.Userです。

流動性のあるAPIを使用してUser.ProfilePictureリレーションシップの主体/従属部分を解決する必要があります(例外状態として)。

だから、ここはオプションです:

(A)Picture.Userプロパティ

public class Picture 
{ 
    public int Id { get; set; } 
    public Album Album { get; set; } 
    public string Path { get; set; } 
    public string Description { get; set; } 
    public DateTime Created { get; set; } 
} 

を削除し、DbContext OnModelCreatingオーバーライド内で次のコマンドを使用します。

modelBuilder.Entity<User>() 
    .HasOptional(e => e.ProfilePicture) 
    .WithOptionalPrincipal(); 

(B) Picture.Userプロパティの名前を変更します。

public class Picture 
{ 
    public int Id { get; set; } 
    public Album Album { get; set; } 
    public string Path { get; set; } 
    public string Description { get; set; } 
    public DateTime Created { get; set; } 
    public User ProfileOf { get; set; } 
} 

UserテーブルにFKであるPicture表にint?コラムをご紹介します

modelBuilder.Entity<User>() 
    .HasOptional(e => e.ProfilePicture) 
    .WithOptionalPrincipal(e => e.ProfileOf); 

両方のオプションを使用します。

+0

私は(A)の提案を感謝しましたが、私はpictureのidの列をuserテーブルに保持して、ピクチャのテーブルに外部キーを作成して、どのピクチャがプロフィール写真は私が避けたいものです。助言がありますか? – amedina

+0

@Kumaは 'Picture'-' User'が1:nの場合のみです。それは* 1:nです。なぜなら、複数のユーザーが同じ画像を参照することを防ぐデータモデルはないからです。何らかの形で検証する必要があります。 –

+0

設定で 'Principal'という言葉を' Dependent'に変更することでこれを行うことができますが、それは依存関係のサイクルを作り出す、つまりユーザの作成、アルバムの作成、画像の作成、写真をユーザのプロフィール画像として設定することに注意してください。単一のトランザクションで実行されます。 –

関連する問題