我是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());
从那时起,我没有任何错误消息,但是当我输入新项目时没有任何反应。
答案 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
;我相信这是不必要的,并且在将来更改模型时可能会产生不良影响。