在单独的DAL项目中播种EF数据库

时间:2012-08-30 15:11:56

标签: asp.net asp.net-mvc entity-framework data-access-layer entity-framework-5

我正在开始一个新的ASP.NET项目,我正在尝试关注multi-project approach I've seen mentioned in multiple questions around Stackoverflow

我一直在关注this教程,但它假设您的整个解决方案只有一个项目。最值得注意的是,它建议使用代码修改Global.asax文件以设置数据库初始化程序。

看到我的DAL项目没有Global.asax文件,播种初始EF数据库的正确程序是什么?

2 个答案:

答案 0 :(得分:2)

在Global.asax的Application_Start中:

Database.SetInitializer(new Configuration());
using (var db = new Context())
{
    try
    {
        db.Database.Initialize(false);
    }
    catch (DataException ex)
    {

    }
    catch (Exception ex)
    {
        throw;
    }
}

Context类位于 DAL

public class Context : DbContext
{
    public Context() : base("YourDatabaseName") { }
    public DbSet<Employee> Employees { get; set; }

    // ...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new EmployeeMap()); 

您可以在专用班级public class EmployeeMap : EntityTypeConfiguration<Employee>中进行映射。

播种在DAL中完成:

public sealed class Configuration : DropCreateDatabaseAlways<Context>
{
    protected override void Seed(Context context)
    {
        // Do your seeding here
    }
}

答案 1 :(得分:2)

我在上面的评论中已经纠正了您可以通过辅助参考访问DAL。如果您真的想在Web项目中不要引用DAL,请在BLL中创建一个Bootstrapper类,为您提供数据库内容

这些示例来自以下博文:http://weblogs.asp.net/rashid/archive/2009/02/17/use-bootstrapper-in-your-asp-net-mvc-application-and-reduce-code-smell.aspx

创建一个引导程序接口

public interface IBootstrapperTask
{
    void Execute();
}

创建一个可以处理数据库配置的类

public class InitializeDatabase : IBootstrapperTask
{
    public void Execute()
    {
        Database.SetInitializer(new Configuration());
        using (var db = new Context())
        {
          try
          {
            db.Database.Initialize(false);
          }
          catch (DataException ex)
          {

          }
          catch (Exception ex)
          {
            throw;
          }
        }
      }
       }

创建一个将执行任务的静态类(可以有多个,注册路由可以移动到BootstrapperTask)

public static class Bootstrapper
{
    static Bootstrapper()
    {
        ConfigureContainer();
    }

    public static void Run()
    {
        var tasks = ServiceLocator.Current.GetAllInstances<IBootstrapperTask>();

        foreach(var task in tasks)
        {
            task.Execute();
        }
    }

    private static void ConfigureContainer()
    {
        IUnityContainer container = new UnityContainer();

        UnityConfigurationSection configuration = (UnityConfigurationSection) ConfigurationManager.GetSection("unity");
        configuration.Containers.Default.Configure(container);

        ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container));
    }
}

最后,你的global.asax将有一个内线

protected void Application_Start()
{
    Bootstrapper.Run();
}

您还可以在博客文章中看到一些web.config要做的事情。此外,this question可以提供更多关于处置等细节的信息。除了简单地不必参考DAL以及围绕社区的一些优秀帖子为什么使用这种模式是一件好事之外,还有更多的好处。以及一些不同的实施方法。