[英]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="data source=server;initial catalog=db;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
將連接字符串從我的MVC應用復制到我的服務,現在可以正常使用了。
猜測是后者,EF被告知模型是什么,並且可以正常工作,但是對於前者,EF不知道要使用哪種模型,因此嘗試解決這個問題,然后拋出由於重復而得到的異常宣言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.