3

Code First (POCO)、EF、ViewModels、および AutoMapper を使用する MVC 4 サンプル アプリケーションがあります。親エンティティと対応する子エンティティが同じビュー (子エンティティのネストされたコレクションを持つエンティティ) にあるコントローラーを作成しました。レコードの更新に問題があることを除けば、これまでのところ良さそうです。次のエラーが表示されます。

操作に失敗しました: 1 つ以上の外部キー プロパティが null 非許容であるため、リレーションシップを変更できませんでした。リレーションシップに変更が加えられると、関連する外部キー プロパティが null 値に設定されます。外部キーが null 値をサポートしていない場合は、新しい関係を定義するか、外部キー プロパティに別の非 null 値を割り当てるか、関連のないオブジェクトを削除する必要があります。

私は何日もオンラインで検索してさまざまなソリューションを試してきましたが、うまくいきませんでした。

次のドメイン モデルがあります。

public class Team
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Player> Players { get; set; }
}

public class Player
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int TeamId { get; set; }
    public virtual Team Team { get; set; }
}

対応するビューモデル:

public class TeamVM
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<PlayerVM> Players { get; set; }
}

public class PlayerVM
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int TeamId { get; set; }
    public virtual TeamVM Team { get; set; }
}

私のマッピングは次のとおりです。

Mapper.CreateMap<Player, PlayerVM>();
Mapper.CreateMap<PlayerVM, Player>();
Mapper.CreateMap<Team, TeamVM>();
Mapper.CreateMap<TeamVM, Team>();

私のチームコントローラーの編集アクションは次のとおりです。

[HttpPost]
public ActionResult Edit(TeamVM teamVM)
{
    if (ModelState.IsValid)
    {
        Team team = context.Teams.Find(teamVM.Id);
        Team updatedTeam = Mapper.Map<TeamVM, Team>(teamVM, team);
        context.Entry(team).CurrentValues.SetValues(updatedTeam);
        context.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(teamVM);
}

ここで何が欠けていますか?

4

1 に答える 1

2

例外の最後の部分についてです。

または無関係なオブジェクトを削除する必要があります

EditあなたのメソッドでPlayerは s が削除されているように見えますteam.Players(または、コピーの失敗のために完全にクリアされることさえあります)。しかし残念なことに、外部キーが null 許容でない場合、子コレクションからアイテムを削除することはできません (どうやら、プレイヤーはチームなしでは存在できません)。コンテキストから削除されたプレーヤーを削除する必要があります。

そのため、チームから削除されたプレーヤーを検出し、それぞれがコールする必要があります

context.Players.Remove(player);
于 2013-05-30T21:08:36.557 に答える