Asp.net mvc 我可以为多个模型类使用一个连接字符串吗?

Asp.net mvc 我可以为多个模型类使用一个连接字符串吗?,asp.net-mvc,connection-string,Asp.net Mvc,Connection String,据我所知,连接字符串仅附加到一个类。但是如果我有很多模型课呢?我可以为多个类使用一个连接字符串吗 这是我的UserModel.cs文件的简单版本: public class UserModel { public int Id { get; set; } public string Email { get; set; } } public class UserTable : DbContext { public UserModel GetByEmail(strin

据我所知,连接字符串仅附加到一个类。但是如果我有很多模型课呢?我可以为多个类使用一个连接字符串吗

这是我的UserModel.cs文件的简单版本:

public class UserModel
{
    public int Id { get; set; }
    public string Email { get; set; }
}

public class UserTable : DbContext
{    
    public UserModel GetByEmail(string Email)
    {    
        return this.Database.SqlQuery<UserModel>("SELECT * FROM Users WHERE Email=@Email", new SqlParameter("Email", Email)).SingleOrDefault();    
    }
}
公共类用户模型
{
公共int Id{get;set;}
公共字符串电子邮件{get;set;}
}
公共类UserTable:DbContext
{    
公共用户模型GetByEmail(字符串电子邮件)
{    
返回此.Database.SqlQuery(“SELECT*FROM Users WHERE Email=@Email”,new SqlParameter(“Email”,Email)).SingleOrDefault();
}
}
这是连接字符串:

<connectionStrings>
    <add name="UserModel"
         connectionString="Server=.\SQLEXPRESS;Database=MyDatabase;User Id=MyUser;Password=MyPassword;"
         providerName="System.Data.SqlClient" />
</connectionStrings>


现在让我们假设我想添加一个名为DataTable的新模型类,它也是从DbContext派生的,就像用户表一样。我需要一个名为相同的连接字符串,还是可以使用已定义的连接字符串?处理多个模型类和连接字符串的常规方法是什么?

连接字符串定义连接到数据库所需的参数

也许我认为您正在谈论或混淆SQL查询和connectionstring

是,一个SQL查询可以在任何给定时间查询多个表。
也许您可以查看google上的“SQL查询语句”以获得更深入的信息。

DbContext类使用ConnectionString与数据库建立连接

通常,DbContext会公开多个模型类

可以有多个DbContext对象使用相同的连接字符串值连接到数据库。通过这种方式,如果需要,您可以将模型的各个部分分离到不同的上下文中(例如,如果您正在创建访问不同表但向应用程序提供类似服务的单独程序集)

需要注意的一点是,EF至少达到5.0时,不能将代码优先迁移用于多个DBContext,一个将覆盖另一个的更改。解决方案是创建一个仅用于迁移过程的聚合DbContext

我已经在自己开发的应用程序中实现了这一点。我使用Unity IoC容器,并构建了一个插件接口,允许我将ConnectionStringName传递到单独的DBContext中。其中一个程序集中的插件示例如下:

public class Bootstrapper : IBootstrapper
{
    public void Bootstrap(IUnityContainer container, string connectionStringName)
    {
        container.RegisterType<ISQService, SQService>();
        container.RegisterType<ISQEntities, SQEntities>(
            new HierarchicalLifetimeManager(), new InjectionConstructor(connectionStringName));
        container.RegisterType<IController, SQController>("SQ");
    }
}
引导程序

public static class Bootstrapper
{
    private static IUnityContainer container;

    public static void Initialise()
    {
        container = BuildUnityContainer();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }

    public static void Dispose()
    {
        container.Dispose();                
    }

    private static void RegisterPlugins(IUnityContainer theContainer, string wildcard, string connectionStringName)
    {
        var pluginBootStrappers = from Assembly assembly in wildcard.LoadAssemblies()
                                  from type in assembly.GetExportedTypes()
                                  where typeof(IBootstrapper).IsAssignableFrom(type)
                                  select (IBootstrapper)Activator.CreateInstance(type);

        pluginBootStrappers.ToList().ForEach(b => b.Bootstrap(theContainer, connectionStringName));
    }

    private static IUnityContainer BuildUnityContainer()
    {
        var theContainer = new UnityContainer();
        const string ConnectionStringName = "MyDb";

        RegisterPlugins(theContainer, "MyApp.Systems.*.dll", ConnectionStringName);

        // Register Application Specific objects
        theContainer.RegisterType<IMyEntities, MyEntities>(
            new HierarchicalLifetimeManager(), 
            new InjectionConstructor(ConnectionStringName));

        theContainer.RegisterType<IAimaService, AimaService>();

        var factory = new UnityControllerFactory(theContainer);
        ControllerBuilder.Current.SetControllerFactory(factory);

        return theContainer;
    }
}
公共静态类引导程序
{
专用静态IUnityContainer容器;
公共静态无效初始化()
{
container=BuildUnityContainer();
SetResolver(新UnitedDependencyResolver(容器));
}
公共静态void Dispose()
{
container.Dispose();
}
私有静态无效寄存器插件(IUnityContainer-the-Container、字符串通配符、字符串连接字符串名)
{
var pluginBootStrappers=来自通配符中的程序集。loadAssemblys()
来自程序集中的类型。GetExportedTypes()
其中typeof(IBootstrapper).IsAssignableFrom(type)
选择(IBootstrapper)Activator.CreateInstance(类型);
pluginBootStrappers.ToList().ForEach(b=>b.Bootstrap(容器、连接字符串名称));
}
私有静态IUnityContainer BuildUnityContainer()
{
var theContainer=newunitycontainer();
常量字符串连接stringname=“MyDb”;
RegisterPlugins(容器“MyApp.Systems.*.dll”,ConnectionString名称);
//注册特定于应用程序的对象
container.RegisterType(
新的层次结构CallifeTimeManager(),
新的注入构造函数(ConnectionStringName));
container.RegisterType();
var工厂=新机组控制器工厂(承包商);
ControllerBuilder.Current.SetControllerFactory(工厂);
返回容器;
}
}

不,我说的是连接字符串。很抱歉,我看到了它是多么的混乱,现在我已经编辑了我原来的帖子。关键是我有两个类,UserTable和DataTable,它们都是从DbContext派生的,或者共享一个连接字符串,或者各自拥有一个连接字符串。连接字符串通常用于标识、配置和连接到数据库。SQL查询用于与表进行交互和查询。通常情况下,我只是根据目标定制SQL查询字符串,而不是使用一个函数来完成所有任务(正如某些用户所做的和某些书籍中所建议的那样),这通常类似于GetDbData(Tablename,ReqFields(),ReqValues())。因此,我将有一个用于GetUserByEmail(电子邮件)的函数,另一个用于GetUserByTaxId(TaxId)的函数和另一个用于GetUserByOccupation(JobTitle)的函数。这是我的方法,每个人都有自己的风格?重要的是你要验证输入的数据(如果有),以避免SQL注入攻击。
public static class Bootstrapper
{
    private static IUnityContainer container;

    public static void Initialise()
    {
        container = BuildUnityContainer();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }

    public static void Dispose()
    {
        container.Dispose();                
    }

    private static void RegisterPlugins(IUnityContainer theContainer, string wildcard, string connectionStringName)
    {
        var pluginBootStrappers = from Assembly assembly in wildcard.LoadAssemblies()
                                  from type in assembly.GetExportedTypes()
                                  where typeof(IBootstrapper).IsAssignableFrom(type)
                                  select (IBootstrapper)Activator.CreateInstance(type);

        pluginBootStrappers.ToList().ForEach(b => b.Bootstrap(theContainer, connectionStringName));
    }

    private static IUnityContainer BuildUnityContainer()
    {
        var theContainer = new UnityContainer();
        const string ConnectionStringName = "MyDb";

        RegisterPlugins(theContainer, "MyApp.Systems.*.dll", ConnectionStringName);

        // Register Application Specific objects
        theContainer.RegisterType<IMyEntities, MyEntities>(
            new HierarchicalLifetimeManager(), 
            new InjectionConstructor(ConnectionStringName));

        theContainer.RegisterType<IAimaService, AimaService>();

        var factory = new UnityControllerFactory(theContainer);
        ControllerBuilder.Current.SetControllerFactory(factory);

        return theContainer;
    }
}