如何使用实体框架4.3.1设置null外键

时间:2013-03-14 14:14:21

标签: asp.net-mvc entity-framework entity

当我通过设置删除一个帖子的图库时遇到麻烦虽然我在执行调试时有时接受null null,但是当断点退却时,它不是null值我该如何解决这个问题? este codigo:

 var postold = _postRepositorio.ObterPorId(postDto.Id);

        if (postold.ImagemCapa != postDto.ImagemCapa && !String.IsNullOrEmpty(postDto.ImagemCapa) && !String.IsNullOrEmpty(postold.ImagemCapa))
        {
            if (
                File.Exists(
                    System.Web.HttpContext.Current.Server.MapPath(
                        Path.Combine(ConfigurationManager.AppSettings["DiretorioImagem"], postDto.ImagemCapa))))
            {
                File.Delete(
                    System.Web.HttpContext.Current.Server.MapPath(
                        Path.Combine(ConfigurationManager.AppSettings["DiretorioImagem"], postold.ImagemCapa)));
            }
        }
        var editPost = AutoMapper.Mapper.Map(postDto, postold);
        editPost.CategoriaPost = _categoriaPostRepositorio.ObterPorId(postDto.CategoriaPost);

        editPost.Galeria = postDto.Galeria == 0 ? null : _galeriaRepositorio.ObterPorId(postold.Id);

        _postRepositorio.Editar(editPost);

        _contexto.SaveChanges();

这是我为画廊添加null的地方

 editPost.Galeria = postDto.Galeria == 0? null: _galeriaRepositorio.ObterPorId (postold.Id);

1 个答案:

答案 0 :(得分:3)

这里的问题与EF默认延迟加载导航属性这一事实有关,除非你明确地急于使用.Include()加载它们。

使用延迟加载时,导航属性将为null,直到您第一次尝试访问它为止。在第一次访问期间,EF将命中数据库以将数据加载到导航属性中。

您的代码没有这样做。您正在尝试在延迟加载属性之前将其设置为null。你可以试试这个:

var tenerGaleria = editPost.Galeria == null; // this will trigger the lazy load
if (postDto.Galeria == 0 && tenerGaleria)
    editPost.Galeria = null; // now setting it to null should work
else if (postDto.Galeria != 0)
  editPost.Galeria = _galeriaRepositorio.ObterPorId(postold.Id);

如果您的实体还公开了外键,您可以将其设置为null,而不必担心导航属性的延迟/急切加载。

if (postDto.Galeria == 0)
    editPost.GaleriaId = null; // set the FK to null
else
    editPost = _galeriaRepositorio.ObterPorId(postold.Id);