存储库模式和一对多关系

Qwe*_*rty 5 .net c# entity-framework

我正在创建一个使用实体框架的应用程序。我有 2 个具有一对多关系的类。据我所知,我决定使用设计模式存储库,这是一个很好的做法。我的界面:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

namespace DataAccess.Repository
{
   public interface IRepository<T>
   {
       void Insert(T entity);
       void Delete(T entity);
       IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);
       IEnumerable<T> GetAll();
       T GetById(int id);
   }
}
Run Code Online (Sandbox Code Playgroud)

我的课

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using DataAccess.Repository;

namespace DataAccess
{
    public class Repository<T> : IRepository<T>  where T : class
    {
        protected DbSet<T> DbSet;

        public Repository(DbContext datacontext)
        {
            //DbContext.Set Method (Type)
            //Returns a non-generic DbSet instance for access to entities of the given type in the context and the underlying store.
            DbSet = datacontext.Set<T>();
        }

        public void Insert(T entity)
        {
            DbSet.Add(entity);
        }

        public void Delete(T entity)
        {
            DbSet.Remove(entity);
        }

        public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
        {
            return DbSet.Where(predicate);
        }

        public IEnumerable<T> GetAll()
        {
            return DbSet;
        }

        public T GetById(int id)
        {
            return DbSet.Find(id);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的两个模型类

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Model
{
    public class Book
    {

        public int BookId { get; set; }
        public string Name { get; set; }
        public string Author { get; set; }
        public string Ganre { get; set; }
        public int Size { get; set; }
        public string Path { get; set; }

    }
}
Run Code Online (Sandbox Code Playgroud)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Model
{
    public  class Category{

        public Category()
        {
            Books = new List<Book>();
        }
        public int CategoryId { get; set; }
        public string CategoryName { get; set; }
        virtual public ICollection<Book> Books { get; set; } 
       }
}
Run Code Online (Sandbox Code Playgroud)

但我的问题是,如何将书添加到类别中? 这是我的实现示例,但书籍未添加到类别中。但是当我想获得所有书籍或所有类别时,一切正常。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using Model;
using DataAccess;
namespace TestDB
{
    class Program
    {
        static void Main(string[] args)
        {
            Database.SetInitializer(
                new DropCreateDatabaseIfModelChanges<BookShelfContext>());

            using (var db = new BookShelfContext())
            {
                var book = new Book
                {
                    Author = "Author Name",
                    Ganre = "Ganre",
                    Name = "Book Name",
                    Path = @"Path",
                    Size = 10
                };
                var category = new Category
                {
                    CategoryName = "Interesting"
                };


                var bookrepository = new Repository<Book>(db);
                var categoryrepository = new Repository<Category>(db);

                IEnumerable<Book> books = bookrepository.GetAll();
                IEnumerable<Category> categories = categoryrepository.GetAll();
                //get all books for example
                foreach (var b in books)
                {
                    Console.WriteLine(b.Name);
                }

            }
            Console.ReadKey();
        }
     }
 }
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助。祝你有美好的一天,减少错误)

Jak*_*lko 2

将上下文添加到您的存储库中,以便您可以实现 SaveChanges 方法:

protected readonly DbContext context;

    public Repository(DbContext datacontext)
    {
        DbSet = datacontext.Set<T>();
        context = datacontext;
    }

    public void SaveChanges()
    {
        context.SaveChanges();
    }
Run Code Online (Sandbox Code Playgroud)

然后,为了将书籍添加到现有的 BookCategory,只需将书籍添加到类别的集合并保存类别:

var categoryrepository = new Repository<Category>(db);
var myCategory = categoryrepository.GetById(1);
myCategory.Books.Add(book);
categoryrepository.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

请记住调用 SaveChanges 以便将数据保留在数据库中。EF 足够聪明,可以注意到您向该类别添加了一个子级,并将其标记为已添加。保存更改后,它将与所需的外键一起插入数据库。