数据库中的实体框架不一致(代码优先)

时间:2014-08-24 19:04:50

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

我正在使用EF的代码优先实用程序来帮助我构建一个简单的ASP.MVC Web API,我会在其中保留一些关于其他项目开发的个人日志。

当我第一次开始创建它时,我给了Log.cs模型一些我认为有必要的属性,后来我删除了它们,因为它们是多余的。

我更新了我的Log.cs模型,然后在PMC中运行了Update-Database -Verbose命令。然后,当我去检查数据库中的Logs表时,我注意到迁移没有删除列,所以我手动完成:删除了列,FK和与它们关联的索引。

到目前为止一直很好,直到我尝试在LogsController中添加一个新Log并执行SaveChanges()调用。现在它为我之前删除的属性提供了“无效的列名'exampleName'”错误。

搜索我未在任何地方找到的属性的解决方案(因此我可以从任何寻找它们的脚本中删除它们)。

我在整个处理过程中将AutomaticMigrationsEnabled和AutomaticMigrationDataLossAllowed设置为true。

由于我的英语非常差,让我提供一些代码来帮助说明问题。

模特:

public class Log
{
    public int Id { get; set; }
    public int OwnerTable { get; set; }
    public int OwnerCode { get; set; }
    public int OwnerId { get; set; }
    public int Hidden { get; set; }
    public string ModificationShort { get; set; }
    public string ModificationLong { get; set; }
    public string Version { get; set; }
    public string Stuff { get; set; }
    public DateTime Date { get; set; }
}

生成错误的控制器(请记住,Log没有自己的控制器,因为该模型用于保存其他模型中已完成更改的信息):

    [HttpPost]
    public ActionResult New(Element elem)
    {
        if(ModelState.IsValid)
        {
            elem.Date = DateTime.Now;
            try
            {
                elem.Code = _db.Elements.OrderByDescending(r => r.Code).ToList().Count + 1;
            }
            catch (Exception)
            {
                elem.Code = 1;
            }

            elem.Logs = new List<Log>();
            elem.Logs.Add(new Log
            {
                Date = DateTime.Now,
                Hidden = 0,
                ModificationShort = "Element criation",
                ModificationLong = "Explanation why the element was added to the project",
                Version = "0.1",
                Stuff = "aditional information that might be usefull later on",
                OwnerTable = Resources.Constants.TABBLE_ELEMENTS,
                OwnerCode = elem.Code,
                OwnerId = elem.Id
            });
            _db.Elements.Add(elem);
            _db.SaveChanges();
            return RedirectToAction("Index", new { name = elem.Name });
        }
        return View(elem);
    }

请忽略代码中与问题无关的所有其他错误,因为这是一项正在进行的工作,我知道它有很多错误。我不能直到修复它。

另外,如果我能提供更多信息以帮助您获得更好的答案,请告诉我。

提前谢谢。

更新:

忘了说我已经尝试了什么。

尝试完全删除数据库(.mdf文件)并再次更新。 尝试从项目中删除Migrations文件夹并在PMC中再次启用它,以便使用相关模型创建新脚本。 尝试了另一个问题中提出的解决方案Entity Framework 5 Code First - How to “start over”? 试图从解决方案中的每个文件中删除每个出现的已删除属性(使用解决方案搜索,不知道解决方案搜索工具无法到达的地方是否仍然存在任何引用)

UPDATE2:

这是:DbContext类的代码:

public class GoPDB : DbContext
    {
        public GoPDB() : base("name=DefaultConnection")
        {

        }
        public DbSet<Ability> Abilities { get; set; }
        public DbSet<Element> Elements { get; set; }
        public DbSet<ElementCard> ElementCards { get; set; }
        public DbSet<Log> Logs { get; set; }
        public DbSet<Piece> Pieces { get; set; }
    }

1 个答案:

答案 0 :(得分:0)

终于找到了我做错了什么。正如我在问题中提到的,项目中的其他模型需要使用Log模型来保存他们的日志,所以我设计项目的方式是在每个其他模型中保留一个ICollection of Log,如下所示:

public int Id { get; set; }
public int Code { get; set; }
public int NumberOfCards { get; set; }
public string Name { get; set; }
public string Theme { get; set; }
public Combinations Combs { get; set; }
public ICollection<ElementCard> Cards { get; set; }
public ICollection<Log> Logs { get; set; }
public DateTime Date { get; set; }

现在问题似乎是你的模型中有一些东西列表,EF会在数据库的某个地方引用它。

我的解决方案是在Logs集合之前添加[NotMapped],这样就可以了。

不幸的是,我不了解足够的框架来解释它比这更好。如果有人可以用更好的解释来发表答案,我会对此进行说明。