【问题标题】:passed dbcontext connection string to DALayer将 dbcontext 连接字符串传递给 DALayer
【发布时间】:2014-07-14 16:45:28
【问题描述】:

我的应用程序中有 4 层 UI,DomainClass,Model(DBCntext),Repository

在存储库中,我有一个像这样的抽象类:

 public abstract class GenericRepository<C, T> :
    IGenericRepository<T>
        where T : class
        where C : DbContext, new()
    {

        private C _entities = new C();
        public C Context
        {

            get { return _entities; }
            set { _entities = value; }
        }

        public virtual IQueryable<T> GetAll()
        {

            IQueryable<T> query = _entities.Set<T>();
            return query;
        }

        public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {

            IQueryable<T> query = _entities.Set<T>().Where(predicate);
            return query;
        }

        public virtual void Add(T entity)
        {
            _entities.Set<T>().Add(entity);
        }

        public virtual void Delete(T entity)
        {
            _entities.Set<T>().Remove(entity);
        }

        public virtual void Edit(T entity)
        {
            _entities.Entry(entity).State = System.Data.Entity.EntityState.Modified;
        }

        public virtual void Save()
        {
            _entities.SaveChanges();
        }

    }

我所有的实体都继承自这个类:

namespace Repository
{
    public class StationRepository : GenericRepository<ShirazRailWay.ShirazRailwayEntities, DomainClass.Station>
    {
    }
}

UI 我称这个存储库。正如你在这里看到的:

  stationrepository objnew=new stationrepository();
  obnew.getall();

在 UI 层中,我在 app.config 中有一个连接字符串,您可以在此处看到:

<connectionStrings>
    <add name="ShirazRailwayEntities" connectionString="metadata=res://*/RailWay.csdl|res://*/RailWay.ssdl|res://*/RailWay.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=****;initial catalog=DB-Metro;user id=sa;password=****;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

但是我想给我的用户一个选项,通过这个选项他们可以自己设置connection string。所以我在 UI 层创建了一个表单,当用户尝试log in 时,它会询问他们连接字符串.我的问题是How can pass this connection string to my dbcontext

在我的model layer(dbcontext) 我有这个:

public partial class ShirazRailwayEntities : DbContext
    {
        public ShirazRailwayEntities()
            : base("name=ShirazRailwayEntities")
        {
        }

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

        public DbSet<Advertisement> Advertisements { get; set; }
        public DbSet<Line> Lines { get; set; }
        public DbSet<Log> Logs { get; set; }
        public DbSet<Path> Paths { get; set; }
        public DbSet<Sensor> Sensors { get; set; }
        public DbSet<Station> Stations { get; set; }
        public DbSet<Train> Trains { get; set; }
        public DbSet<User> Users { get; set; }
        public DbSet<TimeTable> TimeTables { get; set; }
        public DbSet<ConfigFont> ConfigFonts { get; set; }
        public DbSet<ArrivalTime> ArrivalTimes { get; set; }
        public DbSet<ConfigColor> ConfigColors { get; set; }
    }

【问题讨论】:

    标签: c# entity-framework connection-string dbcontext data-layer


    【解决方案1】:

    添加另一个接受连接字符串的构造函数:

    public partial class ShirazRailwayEntities : DbContext
    {
        public ShirazRailwayEntities()
            : base(name: "ShirazRailwayEntities")
        {
        }
    
        public ShirazRailwayEntities(string connectionName)
            : base(name: connectionName)
        {
        }
    }
    
    var context = new ShirazRailwayEntities("whatever connection name you want");
    

    【讨论】:

    • 谢谢。在我的 UI 中我应该创建这个类吗?
    • @E.A.我会使用 IoC 容器将上下文注入您的存储库,并将您的存储库注入您的表示层。我不会直接从 UI 中使用 DbContext。而且,我认为我不会让用户指定他们的连接字符串。相反,我会为您拥有的每个数据库制作具体的 DbContexts,并为用户提供从列表中选择数据库的选项。
    • 你能详细解释一下吗?我应该在哪个层使用这个类
    • @EA - 我对这个问题感到困惑。您是否在问为什么您的存储库不需要连接字符串? GenericRepository 是我看到的唯一抽象类。另外顺便说一句,对于未来的读者来说,将每个问题分成单独的 SO 问题真的会更好。
    • @EA - 听起来不错。在这里给我一个链接,我会在午餐后跳上那个链接。
    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2012-07-11
    相关资源
    最近更新 更多