【问题标题】:Beginner to Entity Framework实体框架初学者
【发布时间】:2017-02-03 11:22:22
【问题描述】:

我是实体框架的初学者。

我正在使用教程学习。

该应用程序包含两个字段和一个提交按钮,应该添加到 SQL SERVER EXPRESS 数据库中。

似乎根本没有与数据库交互。我不知道从哪里开始,因为我没有错误消息,因为我更正了下面的一个。

我的模型:

public class Customer
{
    [Key]
    [Required]
    public int CustomerCode { get; set; }

    [Required]
    [StringLength(10)]
    [RegularExpression("^[A-Z]{7,7}$")]
    public string CustomerName { get; set; }
}

我在 web.config 文件中的连接字符串:

<connectionStrings>
<add 
  name="CustomerDal" 
  connectionString="Data Source=localhost\SQLExpress;Initial Catalog=MVC2db;Integrated Security=True"
  providerName=".NET Framework Data Provider for SQL Server" 
  />

我的数据库上下文:

public class CustomerDal : DbContext 
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Customer>().ToTable("tblCustomer");
    }

    public DbSet<Customer> Customer { get; set; }

}

提交操作:

public ActionResult Submit(
// [ModelBinder(typeof(CustomerBinder))]
Customer obj) //validation runs 
{
 //   Customer obj = new Customer();

   // obj.CustomerCode = Request.Form["CustomerCode"];
  //  obj.CustomerName = Request.Form["CustomerName"];
      if (ModelState.IsValid)
      {
          CustomerDal Dal = new CustomerDal();
          Dal.Customer.Add(obj);     //in memory
          Dal.SaveChanges();          //physical commit 

          return View("Customer", obj);
      }
      else
      { 
          return View("EnterCustomer", obj);
      }
}

EnterCustomer.cshtml,其中obj来自

' @using (Html.BeginForm("Submit", "Customer", FormMethod.Post)) {

        <i>Customer Name : </i> @Html.TextBoxFor(m => m.CustomerName)

    <br>
    @Html.ValidationMessageFor(x => x.CustomerName)
    <br>

        <i>Customer Code : </i> @Html.TextBoxFor(m => m.CustomerCode)

            <br>
            @Html.ValidationMessageFor(x => x.CustomerCode)
            <br>
            <input id = "Submit1" type = "submit" value = "submit"/>

            }

'

我在 SaveChanges 期间收到了关于重复键的第一条错误消息。经过一番研究,我在 global.asax 文件中添加了这一行: Database.SetInitializer(new DropCreateDatabaseIfModelChanges());

从那时起,我没有任何错误消息,但当我输入新项目时没有任何反应。

【问题讨论】:

  • 什么是'obj'?
  • 你能告诉我们错误吗?
  • 由于我尝试将 CustomerCode 的类型更改为 Int,因此错误发生了变化。即使我使用 String 重试,现在的错误是:“支持 'CustomerDal' 上下文的模型自创建数据库以来已更改。考虑使用 Code First 迁移来更新数据库”
  • 我编辑了我的消息以显示 obj 的来源。在调试模式下,值 obj.CustomerCode 和 obj.CustomerName 在错误消息出现之前具有正确的值。
  • 我不明白 C# 和 SQL 之间的这个额外的数据层是如何工作的。我已删除行 Database.SetInitializer(new DropCreateDatabaseIfModelChanges());在 global.asax 中

标签: c# .net entity-framework


【解决方案1】:

模型中的键是整数,默认为 0。当您保存到数据库时,只有一行可以具有该键。您必须转到表设计并将CustomerCode 列设置为标识列,以使其在新记录进入时自动递增。使用您现有的代码,实体框架将检索新创建的键并将其放入您的 CustomerCode 属性因此,如果您愿意,您可以在代码中的其他地方使用它。

您提到您在尝试解决问题时添加了DropCreateDatabaseIfModelChanges;我认为这是不必要的,并且在您将来更改模型时可能会产生不良影响。

【讨论】:

    【解决方案2】:

    您正在创建一个CustomerDal 类型的新空白对象并保存它。 您已经拥有绑定对象obj中的所有值

        if (ModelState.IsValid)
        {
            //CustomerDal Dal = new CustomerDal();//REMOVE THIS LINE
            Dal.Customer.Add(obj);     //in memory
            Dal.SaveChanges();          //physical commit 
    
            return View("Customer", obj);
        }
        else
        { 
            return View("EnterCustomer", obj);
        }
    

    【讨论】:

    • CustomerDal 是 OP DbContext
    【解决方案3】:

    流行于

    public ActionResult Submit(
    // [ModelBinder(typeof(CustomerBinder))]
    Customer obj) //validation runs 
    

    你得到空对象或null。因此,您没有向 dbContext 添加任何内容,因此无需保存任何内容。

    调试应用程序并检查obj 参数中的值。

    【讨论】:

    • obj 参数在 SaveChanges 发生错误之前有正确的值
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多