Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在实体框架中添加实体插入空记录_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 在实体框架中添加实体插入空记录

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

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

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();
    }