我正在开始一个新的ASP.NET项目,我正在尝试关注multi-project approach I've seen mentioned in multiple questions around Stackoverflow。
我一直在关注this教程,但它假设您的整个解决方案只有一个项目。最值得注意的是,它建议使用代码修改Global.asax文件以设置数据库初始化程序。
看到我的DAL项目没有Global.asax文件,播种初始EF数据库的正确程序是什么?
答案 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类,为您提供数据库内容
创建一个引导程序接口
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以及围绕社区的一些优秀帖子为什么使用这种模式是一件好事之外,还有更多的好处。以及一些不同的实施方法。