1

既に存在する 2 つのエンティティ間の関係を簡単に作成したいと思います。

私の場合、複数のジャンルを持つ可能性のある Album エンティティがあります(これもエンティティの束です)

私の Album モデルは次のようになります。

public class AlbumModel : IModel
{
    public List<GenreModel> Genres { get; set; }
    public ArtistModel Artist { get; set; }
    public Guid Id { get; set; }
    public string Title { get; set; }
    public float Price { get; set; }
    public string ArtUrl { get; set; }
}

次に、Album モデル オブジェクトと一連の GenreModel オブジェクト/エンティティ間の関係を作成したいと考えています。

「通常の」エンティティ フレームワークでは、新しい EntityKey を割り当てるだけです..しかし、最初にコードを使用してこれを行う方法がよくわかりません..また、作成したいエンティティに対して xxxxId という追加のプロパティを持っている人もいることに気付きました間の参照..次に、値を xxxxId プロパティに割り当てるだけで、エンティティ間の参照が魔法のように作成されます..これは、1対1または1対多の関係でうまく機能すると思います..しかし、私はそれを推測します多対多の関係では機能しません..または?

とにかく..これは私のGenresModelです:

public class GenreModel : IModel
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public List<AlbumModel> Albums { get; set; }
}

そして、これは私が以前に試したことです..しかし、これは関係を作成しません..データベースに追加のエンティティ/行を作成するだけです..

var artistRepository = new ArtistRepository();
        var genresRepository = new GenreRepository();

        #region Lordi
        context.Albums.Add
            (
                new AlbumModel
                {
                    Artist = artistRepository.GetByName("Lordi"),
                    ArtUrl = "http://upload.wikimedia.org/wikipedia/en/8/8f/The_Monster_Show.jpg",
                    Genres = new List<GenreModel> { genresRepository.GetByName("Rock"), genresRepository.GetByName("Hard rock") },
                    Id = Guid.NewGuid(),
                    Price = 3,
                    Title = "The Monster Show",
                }
            );
        context.Albums.Add
            (
                new AlbumModel
                {
                    Artist = artistRepository.GetByName("Lordi"),
                    ArtUrl = "http://www.nuclearblast.de/static/articles/157/157892.jpg/1000x1000.jpg",
                    Genres = new List<GenreModel> { genresRepository.GetByName("Rock"), genresRepository.GetByName("Hard rock") },
                    Id = Guid.NewGuid(),
                    Price = 10,
                    Title = "Zombilation - The Greatest Cuts",
                }
            );
        #endregion

...そして記録のために...いいえ、私はローディを聴いていません:)..ただのダミーデータ..そして、いくつかの奇妙な不気味な理由で、ローディは頭に浮かんだ最初のバンドでした..

前もって感謝します!

4

2 に答える 2

2

したがって、基本的には、EF で多対多の関係を設定しようとしています。データベースにアルバムとジャンルをリンクするテーブルがあると思いますか? その場合は、ここで説明したように、関係とそれが格納されているテーブルについて EF に知らせる必要があります。「Entity Frameworkで多対多を設定する」などをグーグルで検索すると、多くの追加情報を見つけることができます。

補足として、コレクションのプロパティを仮想に変更することもできます。

public List<GenreModel> Genres { get; set; }

あなたが持っているだろう

public virtual ICollection<GenreModel> Genres { get; set; }

これにより、EF がこれらのプロパティに対して遅延読み込みを実行できるようになり、処理が高速になります。

于 2013-03-12T23:42:42.187 に答える
1

行ったようにこれらのコレクション プロパティを指定すると、 という多対多のリンク テーブルが自動的に作成されますGenreModelAlbumModels

ただし、リポジトリが関係があることを EF が認識できないようになっていると思われます。同じデータ コンテキストで GenreModel エンティティを読み込んでいない場合、それらの間にリンクがあることを認識しない可能性があります。例として、次のコードが機能します。

    using (var context = new DataContext())
    {
        #region Lordi

        context.Albums.Add
            (
                new AlbumModel
                {
                    ArtUrl = "http://upload.wikimedia.org/wikipedia/en/8/8f/The_Monster_Show.jpg",
                    Genres = new List<GenreModel> { context.Genres.First(i => i.Name == "Rock"), context.Genres.First(i => i.Name == "Hard Rock") },
                    Id = Guid.NewGuid(),
                    Price = 3,
                    Title = "The Monster Show",
                }
            );

        context.SaveChanges();

        #endregion
    }

GenreModels は、AlbumModels を追加しているのと同じコンテキストに接続されているため、EF はエンティティ間に関係があることを認識しています。

正しく機能していることを確認するには、DB でそのリンク テーブルを探します。コード内で隠されます。

于 2013-03-13T00:13:32.123 に答える