Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类库中的实体框架代码优先_C#_.net_Entity Framework 4_Entity Framework 4.1 - Fatal编程技术网

C# 类库中的实体框架代码优先

C# 类库中的实体框架代码优先,c#,.net,entity-framework-4,entity-framework-4.1,C#,.net,Entity Framework 4,Entity Framework 4.1,今天早上我刚开始尝试EF4代码,我在一个单独的类库中创建了我的POCO、数据上下文和初始化器类,我相信这是常规的锅炉板类型代码。我在MVC3应用程序中引用该类,并在Global.asax中设置初始值设定项。运行应用程序时,我注意到以下问题 1.任何地方都没有创建数据库(然后我在web.config中为以上下文类命名的连接字符串添加了一个条目,但仍然没有结果) 2.当我试图访问初始化值时,我得到一个空错误,显然是因为没有数据 有谁能帮我指点一下如何让这玩意儿发挥作用吗(如果我整个圣诞节都在学习这玩

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

有谁能帮我指点一下如何让这玩意儿发挥作用吗(如果我整个圣诞节都在学习这玩意儿,但我还是不能让它发挥作用,那就太可惜了:() 谢谢
p、 我尝试插入断点并点击了应用程序初始化方法,但它从未点击初始化器中的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<F2AContext>
        {
            protected override void Seed(F2AContext context)
            {
                var countries = new List<Country> 
                {
                    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<Providers>() 
                {
                    new Providers(){ ProviderName="InfoBip", ContactDetails="Rturo Manovic", Active=true, MessageRates= new List<ProviderRates>(){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<MobileTerminal>()
                {
                    new MobileTerminal(){ Active= true, Credits=200, DateCreated=DateTime.Now, MSISDN="4477565444865"}
                };
                usermobiles.ForEach(u => context.MobileTerminals.Add(u));

                context.SaveChanges();
            }


        }
    }
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Data.Entity;
使用F2A控制器。模型;
命名空间F2AController.DataObjects
{
公共类F2AInitializer:DropCreateDatabaseAlways
{
受保护的覆盖无效种子(文本上下文)
{
var国家=新列表
{
new Country(){CountryName=“Germany”,Active=true},
new Country(){CountryName=“Britain”,Active=true}
};
countries.ForEach(s=>context.countries.Add);
SaveChanges();
var 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));
SaveChanges();
var usermobiles=新列表()
{
new MobileTerminal(){Active=true,Credits=200,DateCreated=DateTime.Now,MSISDN=“4477565444865”}
};
usermobiles.ForEach(u=>context.MobileTerminals.Add(u));
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<Country> Countries;
        public DbSet<MobileTerminal> MobileTerminals;
        public DbSet<Providers> Providers;
        public DbSet<ProviderRates> ProviderRates;
        public DbSet<Property> Properties;
        public DbSet<ShortMessage> ShortMessages;
        public DbSet<UserProperties> UserProperties;

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Data.Entity;
命名空间f2controller.Models
{
公共类文本:DbContext
{
公共DbSet国家;
公共数据集移动终端;
公共数据库集提供商;
公共数据库集提供商费率;
公共数据库集财产;
公共DbSet短消息;
公共数据库集用户属性;
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
}
}
}
Global.asax应用程序初始化方法

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        Database.DefaultConnectionFactory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["F2AContext"].ConnectionString);
        Database.SetInitializer<F2AContext>(new F2AInitializer());

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }
受保护的无效应用程序\u Start()
{
RegisterAllAreas();
Database.DefaultConnectionFactory=新的SqlConnectionFactory(ConfigurationManager.ConnectionString[“F2AContext”].ConnectionString);
SetInitializer(新的f2ainInitializer());
RegisterGlobalFilters(GlobalFilters.Filters);
注册地址(RouteTable.Routes);
}

问题可能与您在web.config中使用的connectionstring有关

对于SQL CE,请使用以下命令

<add name="YourContext"
  connectionString="Data Source=|DataDirectory|yourDB.sdf"
  providerName="System.Data.SqlServerCe.4.0"/>
<add name="YourContext"
     connectionString="Data source=.\SQLEXPRESS;Integrated Security=True;Initial Catalog=YourDatabase;" 
     providerName="System.Data.SqlClient" />
。最好从web.config初始化数据库,而不是从global.asax文件初始化数据库。

Eureka..finally!
在寻找解决方案时,我看到了这篇帖子
应用此处建议的解决方案强制我的数据库创建在启动时像我预期的那样工作,但在运行种子代码时,它抛出了一个空指针异常。在调查时,我意识到任何从上下文类引用DBSet集合的尝试都会产生相同的异常。进一步检查后,我意识到不使用

 public DbSet<MobileTerminal> MobileTerminals { get; set; }
公共数据库集移动终端{get;set;}
我用过

   public DbSet<MobileTerminal> MobileTerminals;
公共数据集移动终端;
这意味着我没有得到任何隐式对象初始化,因此出现了空指针异常。我删除了强制初始化代码并再次运行应用程序,这次种子代码没有运行,直到我访问了一个实际查询数据上下文的页面,并且运行得很好。
显然,由于延迟加载,初始化代码直到实际需要时才运行,即在应用程序中第一次查询数据上下文时


我希望这能帮助将来有同样问题的人。

我想与大家分享另一个问题,当我使用类库进行代码优先时,无意中发现了这篇文章。我在一个库项目中也有我的代码优先POCO和DataContext类,我想用这个项目创建代码优先数据库。我发现有一个-ProjectName标志,创建数据库时可以使用该标志指定要查找的类库项目

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

   update-database -ProjectName 'MyProject.Data'  

发布初始化器类如何?或者至少发布上下文类。您好,感谢您的回复。我已经完成了,但仍然不喜欢。我尝试检查应用程序启动方法中使用的连接字符串,它是一个SQl Express连接字符串,没有初始目录集。尽管我已经设置了连接字符串,但这是事实在web.config和类库中的app.config文件中。你的想法是什么?谢谢你不要讨论这个话题,但一个有趣的调试方法是将上面的代码与
DropCreateDatabaseIfModelChanges
一起使用,而不是
DropCreateDatabaseAlways
(face palm moment)。如果你来到这个页面是为了这个iss