MVC 4.0 Controller无法找到种子数据

时间:2013-04-02 20:13:31

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

我正在尝试使用SQL Server 4.0作为数据库引擎为MVC 4项目播种数据,使用Microsoft MVC音乐商店教程作为示例。我已经设置了种子和数据库上下文模型,但控制器无法找到数据。我已经验证数据库文件是在App_Data中创建的,并验证了在Application_Start中正确设置了SetIntitializer。以下是我的代码:

种子数据:

namespace RationalMethodApp.Models
{
    public class StartData : CreateDatabaseIfNotExists<RationalMethodEntities>
    {
        protected override void Seed(RationalMethodEntities context)
        {
            new List<Basin>
            {
                new Basin {
                    basinId = 1,                                    // attempting to force a key value, will remove
                    Name = "Replace me with a real basin",
                    Location = "In a real location",
                    drainageArea = 0.0M
                }
            }.ForEach(b => context.Basins.Add(b));

控制器:

        public ActionResult Index(int? bsnId)
        {
            if (bsnId == null)                    // here to force a key value, will change
                bsnId = 1;

            var basin = rmDb.Basins.Find(bsnId);

            return View(basin);
        }  

上下文类是:

namespace RationalMethodApp.Models
{
    public class RationalMethodEntities : DbContext
    {
        public DbSet<Basin> Basins { get; set; }
        public DbSet<SubArea> SubAreas { get; set; }
        public DbSet<IdfCurve> IdfCurves { get; set; }
        public DbSet<Analysis> Analyses { get; set; }
        public DbSet<FlowSegment> FlowSegments { get; set; }
        public DbSet<SheetFlowN> SheetFlowNs { get; set; }
        public DbSet<RunoffCoefficient> RunoffCoefficients { get; set; }
        public DbSet<StormFrequency> stormFrequencies { get; set; }
    }

}

调试器告诉我在“.Find”之后控制器中的“basin”对象仍为空。这必须是一个我忽略的简单,基本的东西,但我能在网上找到的所有帮助都假设了问题者知道他们在做什么 - 在我的情况下不是这样!我还在Entity Framework database seed doesn't seed检查了讨论 但这似乎不是答案。请承担一个总的noob问题。

1 个答案:

答案 0 :(得分:0)

您没有显示种子的完整代码,因此我无法确定,但您可能会错过 Context.Changes()

你还写了

public class StartData : CreateDatabaseIfNotExists<RationalMethodEntities>

如果在应用程序启动之前没有删除数据库,它将不会执行任何操作,因为数据库已经存在。

您可以使用:

public class StartData : DropCreateDatabaseAlways <RationalMethodEntities>

每次开始时放弃它或

public class StartData : DropCreateDatabaseAlways <DropCreateDatabaseIfModelChanges >

在模型更改时删除数据库(这对于dev的开始非常有用)

要调试:删除数据库,终止应用程序服务器(因此它将返回到应用程序启动),种子中的断点。启动Debug,如果它进入种子,请在SaveChange()之后检查数据是否在其中。