我正在使用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; }
}
答案 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],这样就可以了。
不幸的是,我不了解足够的框架来解释它比这更好。如果有人可以用更好的解释来发表答案,我会对此进行说明。