1

我想简单地创建两个已经存在的实体之间的关系..

在我的情况下,我有一个专辑实体,它可能有多个流派(这也是一堆实体)

我的专辑模型如下所示:

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; }
}

然后我想在专辑模型对象和一堆流派模型对象/实体之间创建关系。

在“正常”实体框架中,我只会分配一个新的 EntityKey.. 但我不太确定如何首先使用代码来执行此操作.. 我还注意到有些人为他们想要创建的实体有一个名为 xxxxId 的额外属性之间的引用..然后简单地为 xxxxId 属性分配一个值,该属性有些神奇地创建了实体之间的引用..我猜这对于一对一或一对多的关系很好用..但我猜不适用于多对多关系..或者?

无论如何..这是我的 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

...并且为了记录...不,我不听 Lordi :).. 只是虚拟数据.. 由于一些奇怪的怪异原因,Lordi 是第一个想到的乐队..

提前致谢!

4

2 回答 2

2

所以基本上你试图在 EF 中建立一个多对多的关系。我假设有一个表可以链接数据库中的专辑和流派?如果是这样,您需要让 EF 了解关系及其存储的表,正如我在此处解释的那样。通过谷歌搜索“在实体框架中设置多对多”之类的内容,您可以找到很多额外的信息。

在旁注中,您可能还想将您的集合属性更改为 virtual 所以而不是

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
    }

GenreModel 连接到我们将 AlbumModel 添加到的同一上下文,因此 EF 知道实体之间存在关系。

为确保它正常工作,请在数据库中查找该链接表。它将在代码中对您隐藏。

于 2013-03-13T00:13:32.123 回答