1

私はフィクスチャモデルを持っています:

public partial class Fixture
{
    public int FixtureId { get; set; }
    public string Season { get; set; }
    public byte Week { get; set; }

    //foreign key
    public int AwayTeamId { get; set; }
    //navigation properties
    public virtual Team AwayTeam { get; set; }

    //foreign key
    public int HomeTeamId { get; set; }
    //navigation properties
    public virtual Team HomeTeam { get; set; }

    public byte? AwayTeamScore { get; set; }
    public byte? HomeTeamScore { get; set; }
}

そしてフィクスチャDTO:

public class FixtureDTO
{
    public int Id { get; set; }
    public string Season { get; set; }
    public byte Week { get; set; }
    public string AwayTeamName { get; set; }
    public string HomeTeamName { get; set; }
    public byte? AwayTeamScore { get; set; }
    public byte? HomeTeamScore { get; set; }
}

マッピングにAutoMapperを使用していますが、これはこれを使用する最初の試みです。これが私のマッピングです:

CreateMap<Fixture, FixtureDTO>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.FixtureId))
            .ForMember(dest => dest.AwayTeamName, opt => opt.MapFrom(src => src.AwayTeam.TeamName))
            .ForMember(dest => dest.HomeTeamName, opt => opt.MapFrom(src => src.HomeTeam.TeamName));
        CreateMap<FixtureDTO, Fixture>();

フィクスチャを取得し、データを表示するために使用するフィクスチャDTOにマッピングすることで問題なく機能します。しかし、データを更新し、FixtureDTOを返してFixtureにマップし直したい場合、エラーが発生します。

public HttpResponseMessage PutFixture(int id, FixtureDTO fixture)
    {
        if (ModelState.IsValid && id == fixture.Id)
        {
            //do mapping manually here?

            var updated = _repository.UpdateFixture(Mapper.Map<Fixture>(fixture));
            return Request.CreateResponse(updated ? HttpStatusCode.OK : HttpStatusCode.NotFound);
        }
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }

これは私が得るエラーです:

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

誰かがこれを手伝ってくれる?

編集:逆マッピング:

CreateMap<Fixture, FixtureDTO>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.FixtureId))
            .ForMember(dest => dest.AwayTeamName, opt => opt.MapFrom(src => src.AwayTeam.TeamName))
            .ForMember(dest => dest.HomeTeamName, opt => opt.MapFrom(src => src.HomeTeam.TeamName));
        CreateMap<FixtureDTO, Fixture>()
            .ForMember(dest => dest.FixtureId, opt => opt.MapFrom(src => src.Id))
            .ForMember(dest => dest.AwayTeam.TeamName, opt => opt.MapFrom(src => src.AwayTeamName))
            .ForMember(dest => dest.HomeTeam.TeamName, opt => opt.MapFrom(src => src.HomeTeamName));
4

3 に答える 3

0

@lazyberezovskyの回答への拡張:

これは、必要になる可能性のある逆マッピングの (テストされていない) 例です。

CreateMap<FixtureDTO, Fixture>()
        .ForMember(dest => dest.FixtureId,
                   opt => opt.MapFrom(src => src.Id))
        .ForMember(dest => dest.AwayTeam,
                   opt => opt.MapFrom(src => new Team
                                                 {
                                                     TeamName = src.AwayTeamName
                                                 }))
        .ForMember(dest => dest.HomeTeam,
                   opt => opt.MapFrom(src => new Team
                                                 {
                                                     TeamName = src.HomeTeamName
                                                 }));

過去にこの形式を使用したことがあり、うまく機能しましたが、代わりにチーム用の特定のマッピングを作成することもできます。例えば:

CreateMap<string, Team>()....

また、あなたはそれを行っていると思いますが、あなたの構成は有効であると断言します。例えば:

[Test]
public void AutoMapper_Configuration_IsValid()
{
    Mapper.Initialize(m => m.AddProfile<MyProfile>());
    Mapper.AssertConfigurationIsValid();
}
于 2012-11-30T00:48:58.610 に答える
0

通常、その例外は、次のいずれかが検出されたときに EF によってスローされます。

Opimistic Concurrency Violation : これは通常、編集しようとしているエンティティが、ロード、編集、および保存中に他の場所で変更された場合に発生します。(参照: Entity Framework: 「ストア更新、挿入、または削除ステートメントが予期しない行数 (0) に影響しました。」 )

正しく設定されていない ID : Pks または FK に ID が設定されていません。エンティティの FK を誤って値に設定し、関連付けられたオブジェクトを別の ID を持つオブジェクトに設定した場合にも、このような例外が発生しました。

この例外は、リポジトリ内のコードが原因でスローされている可能性があります。リポジトリにコードを投稿すると、例外の原因をよりよく理解できる可能性があります。

于 2012-11-29T19:45:50.587 に答える
0

まず、DTO からエンティティへのリバース マッピングを作成する必要があります (必要に応じて、カスタム メンバー マッピングを提供します)。

Mapper.CreateMap<FixtureDTO, Fixture>();

2 つ目 - 既存のエンティティを取得、マップ、および更新する

if (ModelState.IsValid && id == fixture.Id)
{
    Fixture entity = _repository.FindById(fixture.Id);
    Mapper.Map(fixture, entity); // Use this mapping method!
    var updated = _repository.UpdateFixture(entity);
    // etc
} 
于 2012-11-29T19:47:02.927 に答える