【问题标题】:How to get reference for child entries of the parent in one-to-many relationship?如何在一对多关系中获取父项的子条目的参考?
【发布时间】:2021-04-23 04:26:21
【问题描述】:

我使用 SQLite 和 Entity Framework Core 实现一对多关系。我有 2 个表:表 Albums 代表“一个”,表 Songs 代表“许多”。这是我的 databaseContext 与 AlbumSong 模型类:

namespace SQLite_test2
{
    public class DatabaseContext : DbContext
    {
        public DbSet<Album> albums { get; set; }
        public DbSet<Song> songs { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder dbContextOptionsBuilder)
        {
            dbContextOptionsBuilder.UseSqlite("Data Source =database.db");
        }
    }


    public class Album
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Artist { get; set; }
        public List<Song> Songs { get; set; } = new List<Song>();

    }
    public class Song
    {
        public int Id { get; set; }
        public string Songname { get; set; }

        public int AlbumId { get; set; }

        public Album Album { get; set; }
    }

}

现在让我们添加 1 张专辑和 2 首相关歌曲:

    class Program
    {
        static void Main(string[] args)
        {
            using (var databaseContext = new DatabaseContext())
            {
                Album myAlbum = new Album() { Title = "Toxicity", Artist = "System of A Down" };
                Song mySong1 = new Song() { Songname = "Chop Suey" };
                Song mySong2 = new Song() { Songname = "Psycho" };
                myAlbum.Songs.Add(mySong1);
                myAlbum.Songs.Add(mySong2);

                databaseContext.albums.Add(myAlbum);
                databaseContext.songs.Add(mySong1);
                databaseContext.songs.Add(mySong2);
                databaseContext.SaveChanges();
            }
        }
    }

似乎工作正常:

[]1

当我尝试遍历专辑中的歌曲时,它不起作用:

class Program
{
    static void Main(string[] args)
    {

        using (var databaseContext = new DatabaseContext())
        {
            //Album myAlbum = new Album() { Title = "Toxicity", Artist = "System of A Down" };
            //Song mySong1 = new Song() { Songname = "Chop Suey" };
            //Song mySong2 = new Song() { Songname = "Psycho" };
            //myAlbum.Songs.Add(mySong1);
            //myAlbum.Songs.Add(mySong2);

            //databaseContext.albums.Add(myAlbum);
            //databaseContext.songs.Add(mySong1);
            //databaseContext.songs.Add(mySong2);
            //databaseContext.SaveChanges();

            var myAlbum = databaseContext.albums.Find(5);
            if (myAlbum.Songs.Count == 0)
            {
                //no songs referenced
                Console.WriteLine("no songs referenced");
            }
            foreach (var item in myAlbum.Songs)
            {
                Console.WriteLine("Artist: {0}, Album name: {1} song: {2}", myAlbum.Artist, myAlbum.Title, item.Songname);
            }


        }
    }
}

如何使用 Entity Framework Core 获取 .Songs

额外问题:即使我删除表,主键增量仍然存在。我可以通过将主键重置回 1 来删除表而不完全删除表并重新创建表吗?

【问题讨论】:

  • 你的帖子提到了“实体框架”——而标签上写着entity-framework-core——那么现在你实际上使用的是哪个版本的EF?确保这些内容在您的问题中一致
  • 它是 Entity framework Core 5.0.2 - 提出这个问题时的最新版本。

标签: c# sqlite entity-framework-core


【解决方案1】:

尝试明确包含歌曲:

var myAlbum = databaseContext.albums.Include((x) => x.Songs).Where((album) => album.Id == 5).FirstOrDefault();

至于奖金问题。在 ef 中没有直接的方法来重新设置主键。 虽然可以像这样直接使用sql语句(删除数据后):

efcore 3.x

databaseContext.Database.ExecuteSqlRaw("DBCC CHECKIDENT('Albums', RESEED, 0)")

其他影响

databaseContext.Database.ExecuteSqlCommand("DBCC CHECKIDENT('Albums', RESEED, 0)")

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 2015-04-19
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多