簡體   English   中英

使用Entity Framework for ASP.NET MVC應用程序與Windows Service的行為不一致

[英]Inconsistent behaviour using Entity Framework for ASP.NET MVC app vs windows service

我正在更新現有的ASP.NET MVC應用程序以包括另一個ASP.NET MVC應用程序的一些新功能,而其中的一個組件是Windows服務,它將在用戶在Web應用程序上輸入后生成一些文檔。 整個解決方案使用Autofac進行依賴項注入,使用Entity Framework進行數據庫交互,並使用使用Database First通過EDMX文件生成的模型。

問題在於,盡管Web應用程序運行良好,但只要服務嘗試執行任何返回數據庫的操作,它都會引發異常:

每個類型不支持多個對象集。 對象集“ MyApp.Data.IMyAppEntityContext.AccreditationRules”和“ AccreditationRules”都可以包含“ MyApp.Data.AccreditationRule”類型的實例

在查看了IMyAppEntityContext及其實現MyAppEntityContext之后,它確實在兩個不同的部分類中定義了兩個不同的對象集。 一次進入自動生成的MyAppDataModel.Context.cs文件:

public virtual DbSet<AccreditationRule> AccreditationRules { get; set; }

然后一次在實現IMyAppEntityContext的MyAppEntityContext.cs文件中:

IDbSet<AccreditationRule> IMyAppEntityContext.AccreditationRules
{
    get { return AccreditationRules;  }
}

請注意,我很確定對象/對象集本身不是問題-AccreditationRules恰好是每個文件中的第一個集,因為它是按字母順序排列的第一個,如果我注釋掉它並刪除對其的所有引用,我會得到相同的錯誤只是針對列表中設置的第二個對象。 此外,服務首次嘗試使用數據庫時,它通過執行完全不相關的存儲過程來執行此操作,該存儲過程將完全返回另一個對象。

如果我需要更改其結構,那就好了,打算無論如何都打算離開EDMX文件方法-但是,我不明白的是為什么這對ASP.NET MVC應用程序適用,而不對Windows服務應用程序。 他們兩個都注冊了相同的模塊,使用了相同的存儲庫類,然后它們自己與數據庫進行交互,只是一個很好,而另一個則沒有。 我猜想在ASP.NET MVC應用程序的某個地方 ,它的工作方式有所不同,但是除了某些MVC特定的步驟(例如,注冊MVC控制器)之外,沒有什么區別-它從正確的程序集中注冊了正確的對象所以這不是問題。

如果有幫助的話,這是我的ASP.NET MVC應用程序中的ConfigureContainer()方法,該方法在Global.asax.cs中的Application_Start()中調用:

public static void ConfigureContainer()
{
    var builder = new ContainerBuilder();

    var asm = BuildManager.GetReferencedAssemblies().Cast<Assembly>()
        .Where(x => x.FullName.StartsWith("MyApp."))
        .ToArray();

    builder.RegisterAssemblyModules(asm);
    RegisterLocalTypes(builder); //register types specific to this app

    //MVC specific registration
    builder.RegisterControllers(typeof(MvcApplication).Assembly);
    builder.RegisterApiControllers(typeof(MvcApplication).Assembly);
    builder.RegisterFilterProvider();
    builder.RegisterModule(new AutofacWebTypesModule());

    var container = builder.Build();

    //more MVC specific configuration
    var resolver = new AutofacDependencyResolver(container);
    DependencyResolver.SetResolver(resolver);
    var config = GlobalConfiguration.Configuration;
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}

當我的服務啟動時,將調用以下命令:

public static IContainer AutofacContainer = null;

private void SetupAutofacContainer()
{
    var builder = new ContainerBuilder();

    var asm = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory)
        .Where(file => Path.GetExtension(file) == ".dll")
        .Select(file => Assembly.LoadFrom(file))
        .Where(_ => _.FullName.StartsWith("MyApp."));

    builder.RegisterAssemblyModules(asm.ToArray());
    RegisterLocalTypes(builder); //register types specific to this app        

    AutofacContainer = builder.Build();
}

然后該服務將按如下方式使用該服務:

using (var scope = AutofacContainer.BeginLifetimeScope())
{
    //the actual service code
}

有誰能對此有所了解或為我指明正確的方向?

因此,在嘗試了各種不同的操作並鑽了多個兔子洞之后,解決方案比我預期的要平凡得多-我的連接字符串有誤!

最初,我的服務具有以下連接字符串:

<add name="MyAppEntityContext" connectionString="data source=server;initial catalog=db;integrated security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />

但是我的ASP.NET MVC Web應用程序有一個看起來像這樣的應用程序:

<add name="MyAppEntityContext" connectionString="metadata=res://*/MyAppDataModel.csdl|res://*/MyAppDataModel.ssdl|res://*/MyAppDataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=server;initial catalog=db;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

將連接字符串從我的MVC應用復制到我的服務,現在可以正常使用了。

猜測是后者,EF被告知模型是什么,並且可以正常工作,但是對於前者,EF不知道要使用哪種模型,因此嘗試解決這個問題,然后拋出由於重復而得到的異常宣言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM