0

据我了解,连接字符串仅附加到一个类。但是如果我有很多 Model 类怎么办?我可以将一个连接字符串用于多个类吗?

这是我的 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();    
    }
}

这是连接字符串:

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

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

4

2 回答 2

1

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

您通常有多个由 DbContext 公开的模型类。

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

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

我已经在我构建的应用程序中完成了这项工作。我使用了 Unity IoC 容器,并构建了一个插件接口,允许我将我的 ConnectionStringName 传递到我分离的 DbContexts 中。其中一个程序集中的插件示例是:

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");
    }
}

我的 global.asax 引用了下面的引导程序类:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        ModelBinders.Binders[typeof(DataTable)] = new DataTableModelBinder();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        Bootstrapper.Initialise();
    }

    protected void Application_End()
    {
        Bootstrapper.Dispose();
    }

引导程序

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;
    }
}
于 2013-03-03T13:10:52.227 回答
0

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

也许我认为您正在谈论或混淆 SQL 查询与连接字符串。

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

于 2013-03-03T12:16:31.573 回答