0

我正在开始一个新的 ASP.NET 项目,并且我正在尝试遵循我在 Stackoverflow 的多个问题中提到的多项目方法

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

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

4

2 回答 2

2

Application_StartGlobal.asax 中:

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
    }
}
于 2012-08-30T15:23:51.107 回答
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-代码-smel.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 的事情要做。此外,这个问题可以提供更多关于处置等细节的信息。boostrapping 比简单地不必参考 DAL 有更多的好处,社区中有一些关于为什么使用这种模式是一件好事的优秀帖子以及几种不同的实施方法。

于 2012-08-30T15:55:14.763 回答