0

MVC 3 アプリケーションでエンティティ フレームワーク 4.3 を使用しています。エンティティを更新しようとすると (作成と削除は正常に動作します)、次のエラーが発生します。

Store update、insert、または delete ステートメントが予期しない数の行に影響を与えました (0)

デバッグ モードに入ると、[HttpPost] メソッドでフィード ID が指定されていないことがわかりました。

public ActionResult Edit(Feed feed)
    {
        if (ModelState.IsValid)
        {
            db.Entry(feed).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.FolderId = new SelectList(db.Folders, "FolderId", "Name", feed.FolderId);
        return View(feed);
    }

ただし、通常の Get メソッドでは ID が渡されます。それらは私のエンティティです

餌:

public class Feed
{
    [ScaffoldColumn(false)]
    public int FeedId { get; set; }

    [StringLength(150, ErrorMessage = "The {0} must be less then {1} charecters")]
    public string Title { get; set; }

    [ScaffoldColumn(false)]
    public string Description { get; set; }

    [Required(ErrorMessage = "you must enter a valid link")]
    [StringLength(500, ErrorMessage = "The {0} must be less then {1} characters long.")]
    public string LinkUrl { get; set; }

    [ScaffoldColumn(false)]
    public DateTime PublishDate { get; set; }

    [ScaffoldColumn(false)]
    public string Image { get; set; }

    [ForeignKey("Folder")]
    [Required(ErrorMessage="you must choose a folder")]
    public int FolderId { get; set; }

    public virtual Folder Folder { get; set; }

    public Feed()
    {
        PublishDate = new DateTime(2012, 1, 1);
    }
}

フォルダ:

public class Folder
{    
    public int FolderId { get; set; }

    [Required(ErrorMessage = "you must enter a folder name")]
    [StringLength(150, ErrorMessage = "the {0} must be less then {1} charecters")]
    public string Name { get; set; }
}

私は解決策を探しましたが、DbContext に存在しない更新メソッドを試したり、FeedId と FolderId の上に [Key] プロパティを定義したりするなど、どれも機能しませんでした。

4

4 に答える 4

0

エンティティの状態を手動で維持するべきではありません。変更の追跡はコンテキストによって実行する必要があります。

ビューモデルを使用していて、データベースにアタッチする必要があると想定しています。

あなたは次のようなことをする必要があります..、

Feed DbFeed = DBSet.Where(f => f.id = feed.Id);
DbFeed.Property = NewValue;
db.SaveChanges();

(構文が間違っている可能性があります-私はデフォルトでVBで作業しています)

つまり、DBコンテキストからFeedオブジェクトの新しいインスタンスを取得し、指定されたオブジェクトに対して変更を実行します。

これは、コンテキストが実際にはプレーンFeedオブジェクトを提供するのではなく、それをラップして同じプロパティを持つ匿名タイプを提供するためです。ラッパーはメソッドをオーバーライドし、状態を維持する方法であるプロパティの変更を検出します。

ビューから返されるフィードオブジェクトにはこのラッパーが含まれていないため、問題が発生します

于 2012-05-23T10:52:20.830 に答える
0

Entity Frameworkはオブジェクトを追跡し、ビューから取得するフィードは追跡されません。この状況のパターンは、更新するオブジェクトをデータベースからフェッチしてから、UpdateModelを呼び出して、追跡されていないエンティティから追跡されているエンティティに変更を適用し、保存できるようにすることです。

    if (ModelState.IsValid)
    {
        var trackedEntity = db.Find(feed.Id)
        UpdateModel(trackedEntity);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
于 2012-05-23T10:53:49.440 に答える
0

どうやら、しかし[ScaffoldColumn(false)]属性をモデルに入れても、ビューに作成されず、IDが渡されませんでした。

@Html.HiddenFor(model => model.FeedId)モデルに追加したところ、問題は解決しました。

于 2012-05-24T08:33:39.877 に答える