繁体   English   中英

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

[英]entity framework inconsistency in database (code first)

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

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

我更新了Log.cs模型,然后在PMC中运行Update-Database -Verbose comand。 然后,当我去检查数据库中的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; }
}

产生错误的控制器(请注意,日志没有自己的控制器,因为该模型用于保留有关其他模型中所做更改的信息):

    [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文件)并再次更新。 尝试从项目中删除“迁移”文件夹,然后在PMC中再次启用它,以便它将使用相应的模型创建新脚本。 尝试了另一个问题中提出的解决方案Entity Framework 5代码优先-如何“重新开始”? 尝试从解决方案中的每个文件中删除每次出现的已删除属性(使用解决方案搜索,不知道在解决方案搜索工具无法到达的某个位置是否仍然存在对它的任何引用)

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

终于发现我做错了。 正如我在问题中提到的那样,项目中的其他模型需要使用Log模型来保存其日志,因此我设计项目的方式是在其他每个模型中都保留Log的ICollection,如下所示:

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],就可以了。

不幸的是,我对框架的理解不足,无法对此做更好的解释。 如果有人可以用更好的解释来发布答案,我将予以证明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM