ASP.net实体框架(基本)问题

时间:2011-09-25 21:38:06

标签: database entity-framework asp.net-mvc-3 initializer

(ASP.net MVC 3.0 Razor,EF Code First)

我的第一个问题是:我在哪里存储数据?在初始化程序或.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();

绿色箭头在哪里,是问题所在。 我试图通过上面的list-index(我将艺术家加载到数据库中)来获取艺术家,但是当我测试它时(item.Artist.Name),我什么也得不到。艺术家属性为空!我不明白。为什么?我甚至做得对吗? (我正试图获得艺术家的名字,就是这样)

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

1 个答案:

答案 0 :(得分: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()。如果您使用的是“我的”方法,则只需保存一次。你应该检查实体框架上的一些教程,谷歌是你的朋友:)