0

私は新しい ASP.NET プロジェクトを開始しています。 Stackoverflow に関する複数の質問で言及されているマルチプロジェクト アプローチに従おうとしています。

このチュートリアルに従っていますが、ソリューション全体に対して 1 つのプロジェクトのみを想定しています。最も注目すべきは、データベース初期化子を設定するコードで Global.asax ファイルを変更することを推奨していることです。

私の DAL プロジェクトには Global.asax ファイルがないので、最初の EF データベースをシードするための正しい手順は何ですか?

4

2 に答える 2

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-コード-におい.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 には 1 つのライナーが含まれます。

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

ブログの投稿に表示されるように、いくつかの web.config も実行する必要があります。また、この質問は、破棄などの詳細に関する情報を提供することができます。ブーストラップには、このパターンを使用することがなぜ良いことであるかについて、コミュニティの周りのいくつかの優れた投稿で DAL を参照する必要がないだけでなく、より多くの利点があります。実装に関するいくつかの異なるアプローチ。

于 2012-08-30T15:55:14.763 に答える
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 に答える