Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用通用存储库时连接多个表#_C#_Mysql_Linq_Entity Framework 6_Repository Pattern - Fatal编程技术网

C# 在C中使用通用存储库时连接多个表#

C# 在C中使用通用存储库时连接多个表#,c#,mysql,linq,entity-framework-6,repository-pattern,C#,Mysql,Linq,Entity Framework 6,Repository Pattern,我有一个.Net解决方案,其中包含多个层项目,如下所示 业务(解决方案文件夹) 核心(项目) 接口(项目) 数据(解决方案文件夹) 数据(项目) 演示文稿(解决方案文件夹) 行政小组(项目) 共享(解决方案文件夹) 普通(项目) 我已经使用Unity(即Microsoft.Practices.Unity)实现了IoC层的通用存储库模式。除了我想做多表简单连接或复杂连接之外,其他一切都很好。我试过很多不同的方法。我已经检查了这里的每个现有线程,所以关于存储库中的连接,但没有一个

我有一个.Net解决方案,其中包含多个层项目,如下所示

  • 业务(解决方案文件夹)
    • 核心(项目)
    • 接口(项目)
  • 数据(解决方案文件夹)
    • 数据(项目)
  • 演示文稿(解决方案文件夹)
    • 行政小组(项目)
  • 共享(解决方案文件夹)
    • 普通(项目)
我已经使用Unity(即Microsoft.Practices.Unity)实现了IoC层的通用存储库模式。除了我想做多表简单连接或复杂连接之外,其他一切都很好。我试过很多不同的方法。我已经检查了这里的每个现有线程,所以关于存储库中的连接,但没有一个对我所需要的有用

这是我的存储库类。

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
    {
        protected BuyatimeshareModel Context { get; private set; }

        public Repository(IContextFactory contextFactory)
            : this(contextFactory.Get())
        {
        }

        protected Repository(BuyatimeshareModel context)
        {
            context.Database.Log = message => { Common.Logging.Log(message); };
            Context = context;
        }
        IDbSet<TEntity> DbSet
        {
            get
            {
                return Context.Set<TEntity>();
            }
        }
        public TEntity Add(TEntity instance)
        {
            DbSet.Add(instance);
            Context.SaveChanges();
            return instance;
        }

        public void Remove(TEntity instance)
        {
            DbSet.Remove(instance);
            Context.SaveChanges();
        }
        public TEntity FindOne(Expression<Func<TEntity, bool>> predicate)
        {
            return DbSet.AsQueryable().FirstOrDefault(predicate);
        }

        public IEnumerable<TEntity> All()
        {
            return DbSet.AsQueryable();
        }

        public IEnumerable<TEntity> Query() { IQueryable<TEntity> query = DbSet; return query.ToList(); }

        public IEnumerable<TEntity> FindAll(Expression<Func<TEntity, bool>> predicate)
        {
            return DbSet.AsQueryable().Where(predicate);
        }

        public int Count()
        {
            return DbSet.AsQueryable().Count();
        }

        public int Count(Expression<Func<TEntity, bool>> predicate)
        {
            return DbSet.AsQueryable().Count(predicate);
        }

        public bool Exists(Expression<Func<TEntity, bool>> predicate)
        {
            return DbSet.AsQueryable().Any(predicate);
        }
    }
public class UnityControllerFactory : DefaultControllerFactory
    {
        IUnityContainer container;

        public UnityControllerFactory(IUnityContainer container)
        {
            this.container = container;
        }

        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            try
            {
                if (controllerType == null)
                    throw new ArgumentNullException("controllerType");

                if (!typeof(IController).IsAssignableFrom(controllerType))
                    throw new ArgumentException(string.Format(
                        "Type requested is not a controller: {0}", controllerType.Name),
                        "controllerType");

                return container.Resolve(controllerType) as IController;
            }
            catch { return null; }
        }

        public static void Configure()
        {
            IUnityContainer container = new UnityContainer();
            /*string connectionString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;*/
            container.RegisterType<IContextFactory, ContextFactory>(new ContainerControlledLifetimeManager())//, new InjectionConstructor(connectionString))
                     .RegisterType<IUnitOfWork, UnitOfWork>(new ContainerControlledLifetimeManager())
                     .RegisterType<IAdminService, AdminService>()

                     .RegisterType(typeof(IRepository<>), typeof(Repository<>));
            ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
        }
    }
public class AdminService : IAdminService
    {
        private readonly IRepository<press_releases> pressReleasesRepo;
        private readonly IRepository<tblads> adsRepo;
        private readonly IRepository<tblresorts> resortsRepo;

        public AdminService(IRepository<press_releases> _pressReleasesRepo, IRepository<tblads> _adsRepo, IRepository<tblresorts> _resortsRepo)
        {
            pressReleasesRepo = _pressReleasesRepo;
            adsRepo = _adsRepo;
            resortsRepo = _resortsRepo;
        }
        public List<press_releases> Test()
        {
            var data = pressReleasesRepo.FindAll(p => p.pr_id > 0);
            var data1 =
                (from a in adsRepo.Query()
                    join r in resortsRepo.Query() on a.resort_id equals r.resort_id
                    where a.ad_id == 413
                    select new
                    {
                        OwnerId = a.owner_id,
                        ResortName = r.name,
                        AdId = a.ad_id,
                        AskingPrice = a.askingPriceInt
                    }).ToList();

            var model = data.ToList();
            return model;
        }
    }

以下是存储库中的方法,您正在数据1中使用该方法

public IEnumerable<TEntity> Query() { IQueryable<TEntity> query = DbSet; return query.ToList(); }
public IEnumerable Query(){IQueryable Query=DbSet;return Query.ToList();}
每当您点击“.ToList()”时,它都会点击数据库


如果要先创建查询,然后执行,请使用存储库的“DbSet”属性。

以下是存储库中的方法,您正在数据1中使用该方法

public IEnumerable<TEntity> Query() { IQueryable<TEntity> query = DbSet; return query.ToList(); }
public IEnumerable Query(){IQueryable Query=DbSet;return Query.ToList();}
每当您点击“.ToList()”时,它都会点击数据库


如果要先创建查询,然后执行,请使用存储库的“DbSet”属性。

非常感谢您的回复。我在前面的问题中已经提到过这一点,我知道我返回的是IEnumerable类型,而不是IQueryable,即立即查询与延迟查询。但这给了我一个错误,不同的背景。因此,我无法跳过.ToList(),因为这样。我希望这能解释我的问题。你能发布与ContextFactory相关的代码吗。您正在从中获取DBContext,它是每次创建该上下文还是缓存该上下文。请在ContextFactory中添加GUID字段,并在每次获取时记录该字段,然后查看它们是否相同。有关更多测试方法的建议,请参见此链接。我想我能看出问题从一开始就在哪里。我已经用ContextFactory类内容更新了我的问题。它确实为每个get()调用返回一个新实例。我想我必须改变它的实现,使它成为一个单例类。Unity容器本身被要求将ContextFactory注册为singleton,但我从中返回的模型在每次调用的基础上是唯一的,这是不应该的。非常感谢您的回复。我在前面的问题中已经提到过这一点,我知道我返回的是IEnumerable类型,而不是IQueryable,即立即查询与延迟查询。但这给了我一个错误,不同的背景。因此,我无法跳过.ToList(),因为这样。我希望这能解释我的问题。你能发布与ContextFactory相关的代码吗。您正在从中获取DBContext,它是每次创建该上下文还是缓存该上下文。请在ContextFactory中添加GUID字段,并在每次获取时记录该字段,然后查看它们是否相同。有关更多测试方法的建议,请参见此链接。我想我能看出问题从一开始就在哪里。我已经用ContextFactory类内容更新了我的问题。它确实为每个get()调用返回一个新实例。我想我必须改变它的实现,使它成为一个单例类。Unity容器本身被要求将ContextFactory注册为singleton,但我从中返回的模型在每次调用的基础上是唯一的,这是不应该的。