0

解決策はありますが、正しく作成したかどうかは少し疑問です。私は他の3つのクラスAdを派生させる基本クラスを持っています:

public class Ad
{
    public int Id { get; set; }
    public string Title { get; set; }
    public Address Address { get; set; }
}

私の Address クラスは次のようになります。

public class Address
{
    [ForeignKey("Ad")]
    public int AddressId { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
    public virtual Ad Ad { get; set; }
}

今、私はこのマッピングでオートマッパーを使用しています:

Mapper.Initialize(config => 
        {
            config.CreateMap<Auto, AutoViewModel>()
                            .ForMember(m => m.City, vm => vm.MapFrom(m => m.Address.City))
                            .ForMember(m => m.Street, vm => vm.MapFrom(m => m.Address.Street))
                            .ForMember(m => m.ZipCode, vm => vm.MapFrom(m => m.Address.ZipCode)).ReverseMap();
        });

AutoViewModel は次のようになります。

public class AutoViewModel
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
}

Create アクションと Edit アクションでは、次のバインディングを使用します。

 [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(int id, AutoViewModel vm)
    {
        Address address = new Address();
        address.AddressId = vm.Id;
        address.City = vm.City;
        address.Street = vm.Street;
        address.ZipCode = vm.ZipCode;

        var auto = Mapper.Map<Auto>(vm);

        auto.Address = address;

        if (id != auto.Id)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(auto);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!AutoExists(auto.Id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction("Index");
        }
        return View(auto);
    }

この方法は正しいですか?それを行うエレガントな方法はありますか?そうしないと、重複する外部キーエラーメッセージが表示されるため、AddressIdを明示的に指定する必要がありました...

4

0 に答える 0