0

珍しい問題があります。データベースの 1 つのフィールド (FK_ItemType) は、それ自体を更新しません。私は vs デバッグに入り、int ItemType が割り当てられていること、データベース内にレコードが見つかったこと、そのレコードが item.FK_ItemType に割り当てられたこと、そのレコードが最後まで接続されたままになっていることを確認しましたdb.SaveChanges()(ブレークポイントを使用してitem.FK_ItemType の値を確認してくださいdb.Entry(item).State = EntityState.Modified;

確かに、リダイレクトをコメントアウトしてデータベースからレコードを取得し、値を確認した直後に、リダイレクトの代わりにそれを返しました。正しい値を返します。

ただし、データベースを調べるか、リスト ページに移動すると、新しく更新された ItemType がありません (データベースではまだ NULL です)。さらに不可解なことに、レコードを追加すると、すべてが完全に正常に機能します。

これが私のコントローラーとモデルの関連セクションです

    [HttpPost]
    public ActionResult Edit(Item item, int Company = 0, int Service = 0, int ItemType = 0)
    {
        if (Request.Form["doDelete"] == "true")
            return Delete(item);
        //Get, assign foreign keys
        Company c = db.Companies.Find(Company);
        Service s = db.Services.Find(Service);
        ItemType i = db.ItemTypes.Find(ItemType);
        if (c != null)
            item.FK_Company = c;
        if (s != null)
            item.FK_Service = s;
        if (i != null)
            item.FK_ItemType = i;
        //Force revalidate
        ModelState.Clear();
        //TryUpdateModel(item);
        TryValidateModel(item);

        if (ModelState.IsValid)
        {
            if (item.ItemID == 0) //add
                db.Items.Add(item);
            else
            {
                db.Entry(item).State = EntityState.Modified;
            }
            db.SaveChanges();
            Item i2 = db.Items.Find(item.ItemID);
            Response.Write(i2.FK_ItemType.Name);
            return null;
            // Return to the listing page, and show the user the filters they were looking at before editing.
            return Redirect("~/" + Request.RequestContext.RouteData.Values["Controller"].ToString() + "/Index/" + Request.Form["ref"]);
        }
        // There was a validation error
        if (item.ItemID != 0)
            return Update(item);
        else
            return Add(item);
    }

モデル

public class Item
{
    public int ItemID { get; set; }

    ...

    [Required]
    [Display(Name="Company")]
    public virtual Company FK_Company { get; set; }
    [Required]
    [Display(Name="Service")]
    public virtual Service FK_Service { get; set; }
    [Display(Name="Item Type")]
    public virtual ItemType FK_ItemType { get; set; }
}
4

1 に答える 1

0

名前にもかかわらず、FK_ItemTypeこのプロパティは FK (外部キー) プロパティではありません。これはナビゲーション プロパティであり、状態を に設定しても、ナビゲーション プロパティによって表される関係は更新されませんModifiedFK_Company( 、も同様FK_Serviceです。)

「実際の」外部キー プロパティを導入することもできます...

[ForeignKey("FK_ItemType")]
public int RealFK_ItemType { get; set; }
public virtual ItemType FK_ItemType { get; set; }

// please give those properties better names..., like "ItemTypeID" and "ItemType"

...そして、FKRealFK_ItemTypeを直接使用して関係を変更します。

Itemまたは、ナビゲーション プロパティを設定して関係を変更するには、最初にデータベースから元のエンティティ (関連エンティティを含む) を読み込む必要があります。UPDATE のコードは次のようになります。

var itemIdDb = db.Items
    .Include(i => i.Company)
    .Include(i => i.Service)
    .Include(i => i.ItemType)
    .Single(i => i.ItemID == item.ItemID);

Company c = db.Companies.Find(Company);
Service s = db.Services.Find(Service);
ItemType i = db.ItemTypes.Find(ItemType);
if (c != null)
    itemInDb.FK_Company = c;
if (s != null)
    itemInDb.FK_Service = s;
if (i != null)
    itemInDb.FK_ItemType = i;

db.Entry(itemInDb).CurrentValues.SetValues(item);
db.SaveChanges();
于 2013-01-16T18:49:02.463 に答える