【问题标题】:How to write many to many query in Entity Framework with db first approach?如何使用 db first 方法在实体框架中编写多对多查询?
【发布时间】:2020-11-04 03:15:08
【问题描述】:

数据库模型:

Create table Author
(
    AuthorID int primary key identity,
    Name nvarchar(50)
)

Create table Book
(
    BookID int primary key identity,
    Name nvarchar(50),
    PageCount int
)

Create table AuthorBook
(
    AuthorID int not null foreign key references Author(AuthorID),
    BookID int not null foreign key references Book(BookID)
)

OnModel 创建:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<Author> Author { get; set; }
        public virtual DbSet<AuthorBook> AuthorBook { get; set; }
        public virtual DbSet<Book> Book { get; set; }
        public virtual DbSet<BookGenre> BookGenre { get; set; }
        public virtual DbSet<Genre> Genre { get; set; }
        public virtual DbSet<MyBook> MyBook { get; set; }
        public virtual DbSet<Person> Person { get; set; }
    }

book 和 author 表与 autor_book 联结表存在多对多关系。我如何与作者一起获得书籍?

using (MyLibraryEntities db = new MyLibraryEntities())
{
    var query = db.Book.SelectMany(book => db.Author, (book, author) =>
            new {
                bookID = book.BookID,
                name = book.Name,
                pageCount = book.PageCount,
                authorId = author.AuthorID,
                authorName = author.Name
            }).ToList<dynamic>();
}

我希望得到这样的列表

books = [{"name": book name, "pageCount": 233, authors = {"Carl", "Mike"}, ....]. 

但实际输出是;

[{"name": book name", .. author: "Carl"}, {"name": book, ... author: "Mike"]

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    首先,您应该在模型中创建 Book 和 Author 之间的关系。 检查here

    创建关系后,现在Book 实体拥有Author 的集合。 然后查询简单为:

    using (MyLibraryEntities db = new MyLibraryEntities())
    {
        var query = db.Book.Select(book =>
                new {
                    bookID = book.BookID,
                    name = book.Name,
                    pageCount = book.PageCount,
                    authors = book.Authors.Select(i=>i.Name).ToList()
                }).ToList<dynamic>();
    }
    

    【讨论】:

    • Ado.net 实体模型不仅在其集合中创建两个实体,它还包括桥接表。我做错了什么?我已经为详细信息添加了 SQL 查询。
    • 是的,已添加到问题中。
    • 我仍然得到“书不包含作者的定义”。这似乎很正常,因为 Book 类只初始化 this.AuthorBook = new HashSet();在它的构造函数中。
    • @GONCAŞİLİK 您能否将您的 Book、Author 和 AuthorBook 实体添加到问题中。
    • 系统不允许我添加整个代码。但我认为问题与错误的关系有关。自动模型生成不会为书籍创建作者关系,它只是添加作者书籍。我是否需要在具有多重性的书籍和作者之间添加关联并删除作者书籍?在数据库优先方法中生成多对多关系的最干净和最安全的方法是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2021-10-28
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多