1

私は新しい ASP.NET MVC 4 アプリケーションを手に入れ、それをいじり始めました。過去に Entity-Framework を使用したことはありますが、Code First を使用するのはこれが初めてです。私が抱えている問題は、新しいレコードが追加されると、そのテーブルに一致するレコードが既にあるにもかかわらずPLAYER、新しいレコードも追加されることです。POSITIONS

コントローラ

Player player = new Player();
player.PlayerName = "Bob";

PositionRepository posRepo = new PositionRepository();
player.PlayerPosition = posRepo.Get(1);

PlayerRepository playerRepo = new PlayerRepository();

playerRepo.Add(player);

プレイヤーレポ

public Player Add(Player player)
    {
        _db.Players.Add(player);
        _db.SaveChanges();
        return player;
    }

ポジションレポ

public Position Get(int id)
    {
        return _db.Positions.SingleOrDefault(r => r.Id == id);
    }

役立つ場合は、Player クラスと Position クラスのコードも含めることができます。

要約すると、新しいPLAYERレコードを追加するときに、既存のレコードを参照する必要がありPOSITIONます。POSITION上記の場合、最初のレコードを取得するだけです。代わりに、POSITIONプレーヤーの新しいレコードが作成されます。

興味深いことに、ループ内で複数のプレーヤーを作成すると、新しいPOSITIONレコードは 1 つだけ作成されます。POSITION新しいレコードを作成するのではなく、データベースに既にあるレコードを使用したいので、これはまだ問題です。

4

1 に答える 1

1

クイック推測。

DbContext の別のインスタンスを使用するため、Position レコードが再作成されPlayerRepositoryPositionRepositoryPosition レコードは現在の状態を失います。

これは、リポジトリ パターンと ORM を使用する場合によくある問題です。まだ試していませんが、うまくいくと思います

public Player Add(Player player)
{
    //add this
    _db.Entry(player.PlayerPosition).State = EntityState.Modified;

    _db.Players.Add(player);
    _db.SaveChanges();
    return player;
}
于 2012-12-13T05:25:27.173 に答える