Asp.net mvc 在实体框架中添加实体插入空记录
我正在尝试在EF中插入一个新实体:Asp.net mvc 在实体框架中添加实体插入空记录,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我正在尝试在EF中插入一个新实体: public class Ad { // Primary properties public int Kms { get; set; } // Navigation properties public virtual Model Model { get; set; } } 我从视图中收到如下模型(示例值): 公里数=222 模型Id=3 然后,当我对实体框架进行添加和保存更改时,我在模型表中插入了一条空记录(生成了一个新ID
public class Ad
{
// Primary properties
public int Kms { get; set; }
// Navigation properties
public virtual Model Model { get; set; }
}
我从视图中收到如下模型(示例值):
公里数=222
模型Id=3
然后,当我对实体框架进行添加和保存更改时,我在模型表中插入了一条空记录(生成了一个新ID),在Ad表中插入了一条新的模型ID记录
为什么会这样
服务层:
public void CreateAd(CreateAdDto adDto)
{
var adDomain = Mapper.Map<CreateAdDto, Ad>(adDto);
_adRepository.Add(adDomain);
_adRepository.Save();
}
视图模型:
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; }
}
映射:
Mapper.CreateMap<CreateAdDto, Ad>().ForMember(dest => dest.Model, opt => opt.MapFrom(src => new Model { Id = src.Model_Id }));
Mapper.CreateMap().formMember(dest=>dest.Model,opt=>opt.MapFrom(src=>newmodel{Id=src.Model_Id}));
如果只调用Ad
实例上的Add
方法,所有相关实体都将被视为新实体。因此,您可以先附加模型
实例,然后添加广告
context.Models.Attach(ad.Model);
context.Ads.Add(ad);
context.SaveChanges();
基于@Eranga答案的解决方案(感谢老兄!) 希望这可以帮助其他人,因为它帮助我感谢@Eranga 发生的情况是,在从DTO到域的映射中,模型实体正在从视图中Dropdownlist的模型Id映射到实体模型(如问题中的映射行所示) 然后,当通过实体框架将其添加到数据库时,EF不知道Ad域实体中存在模型导航属性 因此,为了解决这个问题,我必须创建一个新方法,将其添加到我的存储库中,以处理将模型实体附加到广告实体上下文的可能性:
public void Attach(T entity)
{
_dbSet.Attach(entity);
}
和广告服务创建方法中的附加广告:
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();
}
private readonly IRepository\u adRepository;
私有只读IRepository\u searchRepository;
私有只读IRepository模型存储库;
公共AdService(IRepository adRepository、IRepository searchRepository、IRepository modelRepository)
{
_肾上腺性=肾上腺性;
_searchRepository=searchRepository;
_modelRepository=modelRepository;
}
public void CreateAd(CreateAdDto adDto)
{
var adDomain=Mapper.Map(adDto);
_modelRepository.Attach(adDomain.Model);
_肾上腺素能增加(adDomain);
_adRepository.Save();
}
现在,当adDomain对象通过_adRepository.Add到达EF时,它已经知道导航属性模型的存在,并且可以添加新的adDomain ojbect
以前,当adDomain对象到达EF时,EF没有意识到模型的存在,所以它创建了一个空记录
希望这对其他人有帮助
注意。您能告诉我们插入和保存的代码部分吗?在保存更改操作之前是否检查模型值?向我们显示exception@Ammar我有所有的问题要问你check@EIYusubov你说的“你检查了吗”是什么意思?@Patrick,只有在创建时
相册
没有引用其他实例时才有效。UAH!非常感谢你的帮助,我会详细给出答案,希望你的帮助能帮助其他人。再次感谢。当做
public void Attach(T entity)
{
_dbSet.Attach(entity);
}
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();
}