2017-02-03 5 views
0

私はEntity Frameworkの初心者です。Beginner to Entity Framework

私はチュートリアルを使用して学習しています。

アプリケーションは、SQL SERVER EXPRESSデータベースに追加されるはずの2つのフィールドと送信ボタンで構成されています。

データベースとのやり取りはまったくないようです。私は以下を修正して以来、エラーメッセージが表示されないため、どこから開始するのか分かりません。

私のモデル:

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

objが

から来EnterCustomer.cshtml、 ' @using(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"/> 

      } 

'

SaveChanges中に重複したキーに関する最初のエラーメッセージがあります。いくつかの調査の後、私はこの行をglobal.asaxファイルに追加しました: Database.SetInitializer(new DropCreateDatabaseIfModelChanges());

それ以来、エラーメッセージは表示されませんが、新しいアイテムを入力すると何も起こりません。

+0

「obj」とは何ですか? – Sasha

+0

私たちにエラーを表示していただけますか? – Hemal

+0

CustomerCodeのタイプをIntに変更しようとしたので、エラーが変更されました。 Stringを使用して再試行しても、エラーは次のようになります。「データベースが作成されてから、「CustomerDal」コンテキストをサポートしているモデルが変更されました」データベースを更新するためのコードの最初の移行の使用を検討する – Breece

答えて

0

タイプCustomerDalの新しい空白オブジェクトを作成して保存しています。 あなたはすでにあなたが空のオブジェクトまたはnullを取得し

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

にバインドさオブジェクト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); 
    } 
+0

'CustomerDal'はOPの' DbContext'です。 –

0

Popablyのすべての値を持っています。したがって、dbContextには何も追加しないので、保存することはありません。

objパラメータでアプリをデバッグしてチェックします。

+0

SaveChangesでエラーが発生する前にobjパラメータの値が正しい – Breece

0

モデルのキーは整数で、デフォルトは0です。データベースに保存すると、そのキーを持つ行は1つだけです。テーブルデザインに移動して、CustomerCode列をID列に設定して、新しいレコードが入ったときに自動インクリメントにする必要があります。既存のコードでは、Entity Frameworkが新しく作成したキーを取得してCustomerCodeプロパティに入れますあなたが望むならあなたのコードの他の場所でそれを使うことができます。

この問題を解決するときは、DropCreateDatabaseIfModelChangesを追加したことになります。私はこれが不要で、将来あなたのモデルを変更するときに望ましくない影響を及ぼすかもしれないと信じています。