初学者到实体框架

时间:2017-02-03 11:22:22

标签: c# .net entity-framework

我是Entity Framework的初学者。

我正在学习使用教程。

该应用程序包含两个字段和一个应该添加到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" 
  />

我的Db背景:

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());

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

3 个答案:

答案 0 :(得分:0)

您正在创建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);
    }

答案 1 :(得分:0)

Popably in

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

你得到空对象或null。所以你什么都没有添加到dbContext所以没有什么可以保存。

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

答案 2 :(得分:0)

模型中的键是一个整数,默认为0.当您保存到数据库时,只有一行可以拥有该键。您必须转到表设计并将void TreeViewItem_Expanded(object sender, RoutedEventArgs e) { TreeViewItem tvi = e.OriginalSource as TreeViewItem; if (tvi != null) { if (tvi.HasItems) { if (tvi.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) { BringLastItemIntoView(tvi.ItemContainerGenerator); } else { tvi.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged; } } else { tvi.BringIntoView(); } } } void ItemContainerGenerator_StatusChanged(object sender, EventArgs e) { var s = sender as ItemContainerGenerator; if (s.Status == GeneratorStatus.ContainersGenerated) { BringLastItemIntoView(s); s.StatusChanged -= ItemContainerGenerator_StatusChanged; } } void BringLastItemIntoView(ItemContainerGenerator generator) { var tvi = generator.ContainerFromItem(generator.Items.LastOrDefault()) as TreeViewItem; if (tvi != null) { tvi.BringIntoView(); } } 列设置为标识列,以便在新记录进入时自动增加。使用现有代码,Entity Framework将检索新创建的密钥并将其放入您的CustomerCode属性,以便您可以在代码中的其他位置使用它。

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