C#学习教程:entity framework代码类库中的第一个分享


entity framework代码类库中的第一个

我今天早上刚开始尝试使用EF4代码,我在一个单独的类库中创建了POCO,数据上下文和初始化程序类,我相信它是常规的锅炉板类型代码。 我在MVC3应用程序中引用该类,并在Global.asax中设置初始化程序。 在运行应用程序时,我注意到以下问题
1.没有在任何地方创建数据库(然后我在web.config中为Context类命名的连接字符串添加一个条目,仍然没有结果)
2.当我尝试访问初始值时,我得到一个空错误,显然是因为没有数据。

任何人都可以帮我指点如何让你的工作(如果我整个圣诞节都学习这个,我仍然无法让它工作,将是一个耻辱:()谢谢
ps我尝试插入断点并且我点击应用初始化方法,但它永远不会在初始化器中遇到Seed方法,即使我在那里添加了断点!
谢谢。
初始化类

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; using F2AController.Models; namespace F2AController.DataObjects { public class F2AInitializer : DropCreateDatabaseAlways { protected override void Seed(F2AContext context) { var countries = new List { new Country(){ CountryName="Germany", Active = true}, new Country(){ CountryName="Britain", Active = true} }; countries.ForEach(s => context.Countries.Add(s)); context.SaveChanges(); var providers = new List() { new Providers(){ ProviderName="InfoBip", ContactDetails="Rturo Manovic", Active=true, MessageRates= new List(){new ProviderRates(){ CountryId=1, DateCreated=DateTime.Now, DateModified=DateTime.Now, Rate=0.05M, Active=true}}} }; providers.ForEach(p => context.Providers.Add(p)); context.SaveChanges(); var usermobiles = new List() { new MobileTerminal(){ Active= true, Credits=200, DateCreated=DateTime.Now, MSISDN="4477565444865"} }; usermobiles.ForEach(u => context.MobileTerminals.Add(u)); context.SaveChanges(); } } } 

上下文类

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; namespace F2AController.Models { public class F2AContext : DbContext { public DbSet Countries; public DbSet MobileTerminals; public DbSet Providers; public DbSet ProviderRates; public DbSet Properties; public DbSet ShortMessages; public DbSet UserProperties; protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } } } 

Global.asax App初始化方法

  protected void Application_Start() { AreaRegistration.RegisterAllAreas(); Database.DefaultConnectionFactory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["F2AContext"].ConnectionString); Database.SetInitializer(new F2AInitializer()); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } 

Eureka..finally!
在搜索解决方案时,我遇到了这个postEntity Framework Database.SetInitializer根本无法正常工作
应用解决方案建议在那里强制我的数据库创建像我预期的那样在启动时工作,但是在运行种子代码时,它抛出了一个空指针exception。 在调查时,我意识到任何从Context类引用DBSet集合的尝试都会产生相同的exception。 进一步检查我意识到,而不是使用

  public DbSet MobileTerminals { get; set; } 

我曾经用过

  public DbSet MobileTerminals; 

这意味着我没有得到任何隐式对象初始化,因此空指针exception。 我删除了强制初始化代码并再次运行应用程序,这次种子代码没有运行,直到我访问了一个实际查询数据上下文并且运行完美的页面。
显然,由于延迟加载,初始化代码在实际需要之前不会运行,即第一次在应用程序中查询数据上下文。

我希望这可以帮助将来遇到同样问题的人。

我想在首次使用类库代码时遇到另一个问题,并在这篇文章中偶然发现。 我在代码库项目中首先使用了代码POCO和DataContext类,并希望使用此项目来创建我的代码第一个数据库。 我发现有一个-ProjectName标志,可以在创建数据库时指定要查找的类库项目。

  add-migration -Name 'InitialCreate' -ProjectName 'MyProject.Data' update-database -ProjectName 'MyProject.Data' 

问题可能在于您在web.config中使用的连接字符串。

对于SQL CE使用以下

  

对于SQL Express使用以下

  

我想这应该会让事情奏效。

另外,我认为你应该看看这篇文章EF Code First DB Initialization Using Web.Config 。 最好从web.config而不是global.asax文件初始化数据库

上述就是C#学习教程:entity framework代码类库中的第一个分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1031582.html

发表评论

邮箱地址不会被公开。 必填项已用*标注