0

(ASP.net MVC 3.0 Razor,EF 代码优先)

我的第一个问题是:我在哪里存储我的数据?在初始化程序或 .sdf 中?

我的第二个问题是:我有一个歌曲课程,还有一个艺术家课程。

这是来自我的初始化程序:

var Artists= new List<Artist>()
        {
            new Artist{ Name = "ArtistName", Birthday=DateTime.Parse("4-4-1988")}
        };
        Authors.ForEach(s => context.Authors.Add(s));
        context.SaveChanges();

        var Songs= new List<Song>()
        {
            new Song { Name="SongName", Genre = Genre.GenreTypes.Rock, Artist=Artists[0]} //<--
        };
        Books.ForEach(s => context.Books.Add(s));
        context.SaveChanges();

绿色箭头在哪里,就是问题所在。我试图通过上面的列表索引(我将艺术家加载到数据库中)来获取艺术家,但是当我测试它(item.Artist.Name)时,我什么也没得到。艺术家属性为空!我不明白。为什么?我什至做对了吗?(我正在尝试获取艺术家的名字,仅此而已)

最后一个问题:我在作者的课堂上也有一个列表(他的歌曲列表)。我应该如何在那里加载他的歌曲?

4

1 回答 1

1

你什么意思?存储您的数据?您的数据通常保存在您在 connectionString 中选择的数据库中。初始化程序将负责数据库的创建、播种等。

与他的艺术家一起选择一首歌

您可以通过在查询中包含艺术家来获取艺术家。例如:

 yourContext.Songs.Include("Artist").toList()' 

这将返回所有歌曲,并且将为每首歌曲填写艺术家。

与他的艺术家一起选择一首歌

以同样的方式为歌曲填写艺术家。

yourContext.Artists.Include("ListPropertyName").toList()

这是一个可能对您有所帮助的链接:

http://msdn.microsoft.com/en-us/library/bb896272.aspx

与他的艺术家一起保存一首歌。

我将展示我的工作方式,你们的关系应该是这样的:

public class Artist
    {
        [Key]
        public Guid ID { get; set; }

        //..OtherProperties ...

        public virtual ICollection<Songs> Songs { get; set; }
    }

public class Song
    {
        [Key]
        public Guid ID { get; set; }

        //..OtherProperties ...


        //Foreign Key Stuff
        [ForeignKey("Artist")]
        public Guid ArtistId { get; set; }

        //Relationship
        public virtual Artist Artist { get; set; }
    }

如果您以这种方式工作,您可以在歌曲中手动填写 ArtistId。因此,您必须执行以下操作:

var Artists= new List<Artist>()
        {
            new Artist{ Name = "ArtistName", Birthday=DateTime.Parse("4-4-1988"), ID = Guid.NewGuid()}
        };
        Authors.ForEach(s => context.Authors.Add(s));

        var Songs= new List<Song>()
        {
            new Song { Name="SongName", Genre = Genre.GenreTypes.Rock, ArtistId=Artists[0].ID} //<--
        };
        Songs.ForEach(s => context.Songs.Add(s));

        context.SaveChanges();

现在,将 ID 和实际艺术家分开的进展是什么。这很简单,当你创建一个艺术家时,你可以手动设置 ID,你可以稍后在代码中使用它,而不是先保存艺术家。因此,首先你制作你的艺术家并在那里设置 ID,然后你可以直接在你的歌曲中使用它。在您的示例中,您实际上执行 Savechanges() 两次。如果您使用“我的”方法,则只需保存一次。你真的应该检查一些关于实体框架的教程,谷歌是你的朋友:)

于 2011-09-25T21:59:33.273 回答