【问题标题】:entity framework inconsistency in database (code first)数据库中的实体框架不一致(代码优先)
【发布时间】:2014-08-24 19:04:49
【问题描述】:

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

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

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

到目前为止一切顺利,直到我尝试在 LogsController 中添加一个新日志并调用 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”?中提出的解决方案 试图从解决方案中的每个文件中删除所有已删除属性的出现(使用解决方案搜索,不知道是否存在解决方案搜索工具无法到达的任何对它的引用)

更新2:

这是 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; }
    }

【问题讨论】:

  • 你能把你的DbContext类的代码贴出来吗?
  • 您要删除并重新创建数据库吗?
  • 找到了解决方案,编辑了解释我是如何做到的问题。
  • 如果您已经回答了自己的问题,请继续将信息放入正确的答案中,并将其标记为问题的答案(打勾)。

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


【解决方案1】:

终于发现我做错了什么。正如我在问题中提到的,项目中的其他模型需要使用 Log 模型来保存它们的日志,所以我设计项目的方式是在每个其他模型中保留一个 ICollection 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],这样就成功了。

不幸的是,我对框架的理解不够,无法更好地解释它。如果有人可以发布具有更好解释的答案,我会很高兴。

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多