在一个单独的项目DAL播种EF数据库(Seeding EF Database in a Separa

2019-09-21 23:11发布

我开始一个新的ASP.NET项目,我想跟着多项目的方法,我已经看到了周围的多个#1的问题提到 。

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

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

Answer 1:

我站在我的上述评论修正,你将不得不通过二级参考访问DAL。 如果你是真正想在你的web项目引用DAL保持,创建您的BLL一个引导程序的类,它的数据库的东西给你

这些例子从下面的博客文章被拉: http://weblogs.asp.net/rashid/archive/2009/02/17/use-bootstrapper-in-your-asp-net-mvc-application-and-reduce-代码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中要做的事情,以及你将在博客中看到。 此外, 这个问题可以借上布置的细节一些更多的信息,等方面有更多的好处不仅仅是没有,以及对为什么使用这种模式是一件好事引用DAL与各地社区一些优秀的职位,以boostrapping在实施了几个不同的方法。



Answer 2:

Application_Start在Global.asax的:

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

    }
    catch (Exception ex)
    {
        throw;
    }
}

在上下文类生活在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
    }
}


文章来源: Seeding EF Database in a Separate DAL Project