2

次のマッピングを行うのに問題があります。

ドメイン (簡易版):

public class Ad
{
    // Primary properties
    public int Kms { get; set; }

    // Navigation properties
    public virtual Model Model { get; set; }
}

DTO:

public class CreateAdDto
{
    // Primary properties
    public int Kms { get; set; }

    // Navigation properties
    public virtual ModelDto Model { get; set; }
}

ビューモデル:

public class CreateAdViewModel
{
    // Primary properties
    public int Kms { get; set; }

    public int Make_Id { get; set; }
    public int Model_Id { get; set; }

    // Navigation properties
    public IEnumerable<SelectListItem> MakeList { get; set; }
    public IEnumerable<SelectListItem> ModelList { get; set; }
}

コントローラーでマッピングを行うと、ビューのドロップダウンリストから Make_ID が失われます。

    public virtual ActionResult Create(CreateAdViewModel adViewModel)
    {
        if (ModelState.IsValid)
        {
            var adDto = Mapper.Map<CreateAdViewModel, CreateAdDto>(adViewModel);

            _adService.CreateAd(adDto);
        }

        return RedirectToAction(MVC.Home.Index());
    }

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

        Mapper.CreateMap<CreateAdViewModel, CreateAdDto>()

ありがとう。

4

5 に答える 5

1

あなたが言及したように、広告は Model_Id を知り、それをモデルに設定する必要があります

Mapper.CreateMap<CreateAdDto, Ad>()
         .ForMember(dest => dest.Model, opt => opt.MapFrom(src => new Model { Id = src.Model_Id }));

モデルIDを取得する場所をDtoに知らせるために、もう一方のマッピング側からも必要です。

Mapper.CreateMap<Ad, CreateAdDto>()
         .ForMember(dest => dest.Model_Id, opt => opt.MapFrom(src => src.Model.Id}));

Model が null かどうかを確認する検証を追加する必要があるため、上記のコードは安全ではありません。

コードの残りの部分については、正しく実行しているようです。Entity Framework を含むセクションでは、エンティティ モデルが既に存在するため、アタッチする必要があります。そうしないと、EF によってこのエンティティがデータベースに挿入されます。

于 2012-10-25T12:58:19.170 に答える
0

いくつかの調査の結果、解決策が見つかりました:

ビュードメイン:

public class CreateAdViewModel
{
    // Primary properties
    public int Kms { get; set; }

    public int Make_Id { get; set; }
    public int Model_Id { get; set; }

    // Navigation properties
    public IEnumerable<SelectListItem> MakeList { get; set; }
    public IEnumerable<SelectListItem> ModelList { get; set; }
}

DTO:

public class CreateAdDto
{
    // Primary properties
    public int Kms { get; set; }
    public int Model_Id { get; set; }

    // Navigation properties
    //public virtual ModelDto Model { get; set; }
}

ドメイン:

public class Ad
{
    // Primary properties
    public int Kms { get; set; }

    // Navigation properties
    public virtual Model Model { get; set; }
}

ビューモデル -> Dto マッピング:

        Mapper.CreateMap<CreateAdViewModel, CreateAdDto>();

Dto -> ドメイン マッピング:

        Mapper.CreateMap<CreateAdDto, Ad>()
             .ForMember(dest => dest.Model, opt => opt.MapFrom(src => new Model { Id = src.Model_Id })); 

注意:

Entity Framework でこれを実現するには、最初に Model Entity を Context にアタッチしてから、新しい Ad を Ad する必要がありました。

    public void CreateAd(CreateAdDto adDto)
    {
        var adDomain = Mapper.Map<CreateAdDto, Ad>(adDto);

        _modelRepository.Attach(adDomain.Model);

        _adRepository.Add(adDomain);
        _adRepository.Save();
    }

これがベストプラクティスであることを願っています。

ところで、このアプローチに関していくつか意見を述べたいと思います。

ありがとう。

于 2012-10-25T10:53:23.817 に答える
0

あなたの質問の内容に基づいて、簡単なアプローチを提案します。あなたのアプリケーションは中規模です。私の経験によると、保守性については非常に慎重にする必要があります。したがって、以下のアプローチのような単純なストレインフォワードアプローチを自分で作成してみてください。 アプリケーション アーキテクチャ

すべてのレイヤーを詳細に説明できますが、質問のタイトルに注意して、モデル(ビジネスオブジェクト)レイヤーのみを説明することをお勧めします。

モデルまたはビジネス オブジェクト レイヤー

良い!ご覧のとおり、PM.Model には次のものが含まれています。2 つのサブフォルダーには ViewModel が含まれ、ライブラリのルートにはエンティティ フレームワーク オブジェクト (POCO クラス) を含む .tt ファイルがあり、Mapper フォルダーがあります (autoMapper やサードを使用したくないため)。このようなパーティー:))。

ドメイン層に IListBox インターフェイスが表示されます。すべての ListBox コンテナをこのインターフェイスに配置しました。

現在のアプローチが役立つことを願っていますが、最終的には、このレイヤー DTO または ViewModel のいずれかを削除することをお勧めします。将来的には非常に複雑になるからです。

幸運を

于 2012-11-13T22:18:31.913 に答える
0

CreateAdDto には、Make ナビゲーション プロパティまたは Make_Id プロパティがありません。

于 2012-10-24T16:08:04.420 に答える
-2

これらのマッピングのコストについて知っていますか?! 単純な挿入用に (エンティティ フレームワークに到達する前に) 2 レイヤー マッピングがあります。2 レイヤー未満のマッピングでより複雑な CRUD を実行できます。このコードの保守性をどう考えるか?

DRY、KISS、SOLIDの慣例を心に留め、日々の仕事の最優先事項にしてください。

幸運を

于 2012-11-12T04:39:55.733 に答える