0

我正在尝试在 EF 中插入一个新实体:

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

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

我从 View 中收到这样的模型(示例值):

kms = 222 型号.Id = 3

然后,当我执行实体框架的 Add 和 SaveChanges 时,我会在模型表中插入一条 NULL 记录(生成一个新 ID),并在广告表中使用新插入的模型 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; }
}

Dto:

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 映射到实体模型(正如您在问题的映射行中看到的那样)。

然后,当它通过实体框架添加到数据库时,EF 并不知道广告域实体中存在模型导航属性。

因此,为了解决这个问题,我必须创建一个新方法来向我的存储库添加一个新方法,以处理将模型实体附加到广告实体上下文的可能性:

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 ojbect。

之前,发生的事情是,当 adDomain 对象到达 EF 时,EF 不知道 Model 的存在,因此它正在创建一个空记录。

希望这对其他人有帮助。

问候。

于 2012-10-25T09:14:14.097 回答