代码之家  ›  专栏  ›  技术社区  ›  mynameiscoffey

实体框架-联接空值-用户代码未处理空引用异常

  •  0
  • mynameiscoffey  · 技术社区  · 15 年前

    我正在编写一个ASP.NET MVC应用程序来学习实体框架,并遇到了一个我不知道如何处理的问题。为了简单起见,我们采用以下表格结构:

    Movie  
    ID (int, not null, auto increment)  
    Name (varchar)  
    GenreID (int)
    

    Genre  
    ID (int, not null, auto increment)  
    Name (varchar)
    

    movie.genre id是对tyre.id的FK引用

    我使用VisualDesigner在VS 2008中引入了所有表,并尝试了以下LINQ查询:

    IEnumerable<Movie> movieList = from f in dataContext.MovieSet.Include("Genre").ToList();
    

    我可以使用以下方法在视图中输出数据:

    <%= Html.Encode( movieList.Genre.Name ) %>
    

    一切正常,直到我在电影桌上有一个空的genreid项目。对于这个查询,我是否可以做些什么使它仍然能够输出(如果适用,只需将其保留为空),或者我是否做了严重错误的事情?

    2 回复  |  直到 15 年前
        1
  •  0
  •   Sander Rijken    15 年前

    这可能比 .Include("")

    from f in dataContext.MovieSet
    select new
        {
           Name = f.Name,
           Genre = f.Genre // This effectively performs a join.
           ...
        }
    

    您也可以这样检查问题:

    from f in dataContext.MovieSet
    select new
        {
           Name = f.Name,
           GenreName = f.Genre == null ? "" : f.Genre.Name
           ...
        }
    

    这会给您带来更多的灵活性,例如:

    from f in dataContext.Genres
    select new
        {
            Name = f.Name
            Movies = from movie in f.Movies
                     where movie.Duration > 240
                     select movied
        }
    
        2
  •  1
  •   SLaks    15 年前

    问题是 movieList.Genre 为空,您无法访问 Name A的性质 null 对象。

    你可以通过写作来解决这个问题 <%= Html.Encode(movieList.Genre == null ? String.Empty : movieList.Genre.Name) %> .

    如果不希望视图如此冗长,可以添加 GenreName 属性到 Movie 实体类并将空检查移到那里。