C# 初学者到实体框架
我是实体框架的初学者 我正在使用教程学习 该应用程序包含两个字段和一个提交按钮,应该添加到SQLServerExpress数据库中 似乎根本没有与数据库的交互。我不知道从哪里开始,因为我没有错误消息,因为我更正了下面的一个 我的模型:C# 初学者到实体框架,c#,.net,entity-framework,C#,.net,Entity Framework,我是实体框架的初学者 我正在使用教程学习 该应用程序包含两个字段和一个提交按钮,应该添加到SQLServerExpress数据库中 似乎根本没有与数据库的交互。我不知道从哪里开始,因为我没有错误消息,因为我更正了下面的一个 我的模型: public class Customer { [Key] [Required] public int CustomerCode { get; set; } [Required] [StringLength(10)]
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"
/>
输入customer.cshtml,obj来自何处
"
@使用(Html.BeginForm(“提交”、“客户”、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"/>
}
Customer Name:@Html.TextBoxFor(m=>m.CustomerName)
@Html.ValidationMessageFor(x=>x.CustomerName)
客户代码:@Html.TextBoxFor(m=>m.CustomerCode)
@Html.ValidationMessageFor(x=>x.CustomerCode)
}
"
在保存更改期间,我收到了第一条关于重复密钥的错误消息。经过一些研究,我在global.asax文件中添加了这一行:
SetInitializer(新的DropCreateDatabaseIfModelChanges())
从那时起,我没有任何错误消息,但当我输入一个新项目时,什么也没有发生 您正在创建类型为
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);
}
流行于
public ActionResult Submit(
// [ModelBinder(typeof(CustomerBinder))]
Customer obj) //validation runs
您将获得空对象或null。因此,您不向dbContext添加任何内容,也不保存任何内容
调试应用程序并检查
obj
参数中的值 模型中的键是一个整数,默认为0。保存到数据库时,只有一行可以有该键。您必须转到表设计,并将CustomerCode
列设置为标识列,以使其在新记录进入时自动递增。使用现有代码,Entity Framework将检索新创建的键并将其放入CustomerCode属性中,以便您可以在代码中的其他位置使用它(如果您愿意)
您提到在尝试解决问题时添加了
DropCreateDatabaseIfModelChanges
;我认为这是不必要的,并且在将来更改模型时可能会产生不必要的影响。什么是“obj”?您能告诉我们错误吗?因为我尝试将CustomerCode的类型更改为Int,所以错误发生了变化。即使当我用字符串重试时,现在的错误是:“自从创建数据库以来,支持“CuuldDAL”上下文的模型发生了变化。请考虑使用代码第一次迁移来更新数据库。”我编辑了我的消息,以显示Objo来自何处。在调试模式下,obj.CustomerCode和obj.CustomerName的值在错误消息出现之前是正确的。我不明白C#和SQL之间的这一附加数据层是如何工作的。我已经删除了line Database.SetInitializer(新的DropCreateDatabaseIfModelChanges());在global.asaxCustomerDal
中,是OPDbContext
。在SaveChanges发生错误之前,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);
}
public ActionResult Submit(
// [ModelBinder(typeof(CustomerBinder))]
Customer obj) //validation runs