0

EFに新しいエンティティを挿入しようとしています:

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

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

そして、View から次のようなモデルを受け取ります (値の例):

kms = 222 Model.Id = 3

次に、Entity Framework の Add と SaveChanges を実行すると、モデル テーブル (新しい ID を生成) に挿入された NULL レコードと、新しく挿入されたモデル ID を持つ広告テーブルのレコードが取得されます。

なぜこうなった?

サービス層:

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

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

リポジトリ:

    public void Add(T entity)
    {
        _dbSet.Add(entity);
    }

   public void Save()
    {
        try
        {
            _dataContext.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            var s = e.EntityValidationErrors.ToList();
            throw;
        }
    }

ビューモデル:

public class CreateAdViewModel
{
    // Primary properties
    public string Version { get; set; }
    public int Kms { get; set; }
    public int Year { get; set; }
    public decimal Price { 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; }
}

宛先:

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

マッピング:

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

2 に答える 2

1

Addインスタンスでメソッドを呼び出すだけではAd、関連するすべてのエンティティが新しいエンティティとして扱われます。したがって、Model最初にインスタンスをアタッチして、Ad.

context.Models.Attach(ad.Model);
context.Ads.Add(ad);
context.SaveChanges();
于 2012-10-25T03:56:17.253 に答える
1

@Eranga回答に基づくソリューション(ありがとうございます!)

@Erangaのおかげで私を助けてくれるので、これが他の誰かを助けることができることを願っています。

DTO から DOMAIN へのマッピングで、モデル エンティティがビューのドロップダウンリストからの Model_Id からエンティティ モデルにマッピングされていたことが発生していました (質問のマッピング行でわかるように)。

その後、Entity Framework を介してデータベースに追加されたとき、EF は Ad Domain Entity に Model ナビゲーション プロパティが存在することを認識していませんでした。

したがって、これを解決するために作成しなければならなかったのは、モデル エンティティを広告エンティティ コンテキストにアタッチする可能性を処理するために、リポジトリに新しいメソッドを追加することでした。

public void Attach(T entity)
{
    _dbSet.Attach(entity);
}

Ad Service の Create メソッドでアタッチします。

    private readonly IRepository<Ad> _adRepository;
    private readonly IRepository<Search> _searchRepository;
    private readonly IRepository<Model> _modelRepository;


    public AdService(IRepository<Ad> adRepository, IRepository<Search> searchRepository, IRepository<Model> modelRepository)
    {
        _adRepository = adRepository;
        _searchRepository = searchRepository;
        _modelRepository = modelRepository;
    }

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

        _modelRepository.Attach(adDomain.Model);

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

したがって、adDomain オブジェクトが _adRepository.Add を通じて EF に到達すると、ナビゲーション プロパティ Model の存在が既に認識されており、新しい adDomain オブジェクトを追加できます。

以前は、adDomain オブジェクトが EF に到着したとき、EF はモデルの存在を認識していなかったため、null レコードを作成していました。

これが他の誰かに役立つことを願っています。

よろしく。

于 2012-10-25T09:14:14.097 に答える