При использовании ASP.NET MVC 3 с EF 4.1 Code First я могу редактировать только основную таблицу, что я делаю не так? - PullRequest
1 голос
/ 06 июля 2011

Краткое описание того, что я делаю. Я создаю довольно грубую базу данных по отслеживанию активов с использованием ASP MVC 3 и EF Code First. Я могу создать новый актив. Я могу просмотреть подробную информацию об активе. Я даже могу отобразить вид редактирования и редактировать AssetTag. Однако запись не будет обновлять ни одно из других полей. Если я редактирую LocationName, например. Он будет вести себя так, как будто он публикует, и возвращает меня в представление «Индекс», но запись никогда не публикует изменения.

Я создал модель ниже

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

У меня есть этот DbDataSet, который использует вышеуказанную модель AssetModel:

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

В моем AssetController у меня есть это для редактирования:

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

А вот и 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>

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

ваш 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, то, что вы ранее показали, что ваша DbContext состоит только из AssetModel

Обновление: Проблема может заключаться в том, что когда вы переходите к методу post редактирования, Актив больше не связан с Активом базы данных, из которого он был первоначально загружен, попробуйте изменить его на

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

Очевидно, что это не то поведение, которое вам нужно, я просто пытаюсь выяснить, можно ли сохранить некоторые изменения и перейти оттуда

0 голосов
/ 06 июля 2011

Ваши классы модели должны расширяться DbContext:

 public class AssetModel :DbContext{}
...