实体框架:更新条目

时间:2016-12-15 19:37:36

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

我知道有很多关于它的问题,但我读过它们中的20个并且找不到我的答案。我有这个错误

  

“类型的例外   发生'System.Data.Entity.Infrastructure.DbUpdateException'   EntityFramework.dll但未在用户代码中处理

     

其他信息:更新条目时发生错误。   有关详细信息,请参阅内部异常。“

当我去InnerException时,它说

  

“无效的对象名称'dbo.Samochodies'。”

。我不知道这到底是什么,因为我的程序中没有任何“Samochodies”..无论如何,这就是代码:

CarsController.cs

public ActionResult Create([Bind(Include = "Id,Brand,Model,Price,Bought,Sold")] Samochody car)
    {
        if (ModelState.IsValid)
        {
            baza.Cars.Add(car);
            baza.SaveChanges(); //error here
            return RedirectToAction("Index");
        }
        return View(car);
    }

Samochody班

public class Samochody
{
    public int Id { get; set; }
    public string Brand { get; set; }
    public string Model { get; set; }
    public decimal Price { get; set; }
    public DateTime Bought { get; set; }
    public DateTime Sold { get; set; }

    public class CarDBCtxt : DbContext
    {
        public DbSet<Samochody> Cars { get; set; }
    }

3 个答案:

答案 0 :(得分:0)

当您使用现有数据库时,如果您没有在映射实体时指定表名,那么EF将尝试按照惯例查找数据库中名为Samochodies的表。一种解决方案可能是使用Table属性来指定实际表名:

[Table("YourTableName")]
public class Samochody
{
  //...
}

现在,也许异常是因为您更改了实体的名称。对于这样的情况,EF有一些初始化程序可以帮助您在每次更改模型时解决此类问题,在您的情况下它将是:

public class CarDBCtxt : DbContext
{
    public DbSet<Samochody> Cars { get; set; }

    public CarDBCtx(): base("CarDBCtxt") 
    {
      Database.SetInitializer(new DropCreateDatabaseIfModelChanges<CarDBCtxt>());  
    }
}

如果您想了解有关初始化程序的更多信息,请查看此link

答案 1 :(得分:0)

这个答案对Koskilla的帮助了我:

修改我的模型以使用可为null的DateTime类型的对象(Nullable?-type)解决了该问题。因此,简而言之,要解决错误“将datetime2数据类型转换为DateTime数据类型导致值超出范围”,请将模型中的DateTime属性更改为DateTime?。

示例:

// "Nullable DateTime", DateTime?, won't throw an error in the cast in EF
public DateTime? StartDate { get; set; }

然后您就去了!

答案 2 :(得分:0)

问题在于表的ID不是AUTO_INCREMENT,请将该ID设置为AUTO_INCREMENT