2011-07-06 1 views
1

私がしていることの簡単な説明。私は、ASP MVC 3とEFコードファーストアプローチを使用して、かなり原油資産トラッキングデータベースを作成しています。私は新しい資産を作ることができます。私は資産の詳細を見ることができます。編集ビューを表示してAssetTagを編集することもできます。ただし、レコードでは他のフィールドは更新されません。たとえば、LocationNameを編集するとします。投稿されているように動作し、インデックスビューに戻りますが、実際には変更が実際には記録されません。EF 4.1コードでASP.NET MVC 3を使用すると、メインテーブルのみを編集できますが、何が間違っていますか?

私が作成している私は、上記AssetModelを使用しています。このDbDataSetいる

public class AssetModel 
{ 
    public int id { get; set; } 
    public string AssetTag { get; set; } 
    public virtual Location Location { get; set; } 
    public virtual Hardware Hardware { get; set; } 
    public virtual Software Software { get; set; } 
    public virtual User User { get; set; } 
} 



public class Location 
{ 
    public int LocationId { get; set; } 
    public string LocationName { get; set; } 
} 
public class Hardware 
{ 
    public int HardwareId { get; set; } 
    public string Manufacturer { get; set; } 
    public string Make { get; set; } 
    public string Model { get; set; } 

} 

public class Software 
{ 
    public int SoftwareId { get; set; } 
    public string PublisherName { get; set; } 
    public string SoftwarePackageName { get; set; } 
    public string SoftwarePackageVersion { get; set; } 
    public string SerialNumber { get; set; } 
    public bool IsVolumeLicense { get; set; } // as in "Yes this is a Vol. Lic. Agreement" 
    public LicenseAgreement LicenseAgreement { get; set; } 
} 

public class LicenseAgreement 
{ 
    public int LicId { get; set; } 
    public string VolumeLicenseAgreementCompany { get; set; } 
    public string AgreementIdentifier { get; set; } 
    public DateTime VolumeLicenseStartDate { get; set; } 
    public DateTime VolumeLicenseExpirationDate { get; set; } 
    public Int16 NumberOfLicenses { get; set; } 

} 

public class User 
{ 
    // may remove this at some time and pull from Active Directory. 
    // for now we take the easy route. 
    public int UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

以下のモデル:

public ActionResult Edit(int id) 
    { 
     AssetModel assetmodel = db.Assets.Find(id); 
     return View(assetmodel); 
    } 
    // 
    // POST: /Asset/Edit/5 

    [HttpPost] 
    public ActionResult Edit(AssetModel assetmodel) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(assetmodel).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(assetmodel); 
    } 

:私は編集のためにこれを私のAssetControllerで

public class AssetContext : DbContext 
{ 
    public DbSet<AssetModel> Assets { get; set; } 
} 

を持っていますここにEdit.cshtml

があります
@model ISHelpDesk.Models.AssetModel 

@{ 
    ViewBag.Title = "Edit"; 
    } 

<h2>Edit</h2> 
@using (Html.BeginForm("Edit", "Asset")) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>AssetModel</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.AssetTag) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.AssetTag) 
     @Html.ValidationMessageFor(model => model.AssetTag) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Location.LocationName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Location.LocationName) 
     @Html.ValidationMessageFor(model => model.Location.LocationName) 
    </div> 

    </fieldset> 
<p><input type="submit" value="Save"</p> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 
+0

もちろん、これはあなたが持続し、私はちょうどあなたには、いくつかの変更を取得することができるかどうかを確認しようとしていたい行動ではないかもしれない

public ActionResult Edit(int id) { AssetModel assetmodel = db.Assets.Find(id); return View(assetmodel); } [HttpPost] public ActionResult Edit(int id, FormCollection collection) { AssetModel assetmodel = db.Assets.Find(id); if (TryUpdateModel(assetmodel)) { db.SaveChanges(); return RedirectToAction("Index"); } return View(assetmodel); } 

にそれを変えることで行くと、そこから行く私はまた私がいることを言及するのを忘れてしまいましたSQL Server CEも使用します。 – Norm

答えて

2

あなたAssetContext

public class AssetContext : DbContext 
{ 
    public DbSet<AssetModel> Assets { get; set; } 
    public DbSet<Location> Locations { get; set; } 
    public DbSet<Hardware> Hardwares { get; set; } 
    public DbSet<Software> Softwares { get; set; } 
    public DbSet<LicenseAgreement> LicenseAgreements { get; set; } 
    public DbSet<User> Users { get; set; } 
} 

これはDbContextにテーブルとしてあなたのクラスのそれぞれを登録しているべきです、あなたが持っていたもの問題は、あなたが編集のPOSTメソッドを取得する場合、資産はもはやそれは元々からロードされたデータベースの資産に関連付けられていることもないかもしれない、持っている:前に、あなたのDbContextだけAssetModel

アップデートで構成されて示しました。

+0

お手伝いをありがとう。私はあなたが何を言っているのか理解しています。私はその変更を行いましたが、まだ更新はありません。あなたが想像するように、それはイライラしています。 – Norm

+0

これで問題は解決しません。ありがとうございました。今私はなぜそれを考えなければなりません。あなたはシズル! – Norm

0

モデルクラスはDbContextを拡張する必要があります。

public class AssetModel :DbContext{} 
+0

それは素晴らしいですが、残念ながらそれはうまくいきませんでした。私は本当に私の指を横切っていて、それは愚かなものだったと思っていました。 :) – Norm

+0

これはうまくいくでしょう。編集を参照してください – ZeroDivide

+0

ありがとう、私はすでにそこにあったdbcontext全体を投稿する必要があります。 – Norm

関連する問題