Сущность: получение пустого исключения с использованием внешнего ключа - PullRequest
2 голосов
/ 27 марта 2010

Возникли проблемы с тем, что должно быть очень простым сценарием. Например, у меня есть две таблицы:

-Пользователи -Комментарии

Для этого установлены отношения один-ко-многим; есть внешний ключ от Comments.CommentorID до Users.UserID. Когда я делаю запрос LINQ и пытаюсь привязать к DataList, я получаю нулевое исключение. Вот код:

FKMModel.FKMEntities ctx = new FKMModel.FKMEntities();
        IQueryable<Comment> CommentQuery =
            from x in ctx.Comment
            where x.SiteID == 101 
            select x;
        List<Comment> Comments = CommentQuery.ToList();
        dl_MajorComments.DataSource = Comments;
        dl_MajorComments.DataBind();

На странице ASPX в качестве ItemTemplate у меня есть следующее (я упростил его, вынул стили и т. Д. Для публикации здесь, поскольку это не имеет значения):

<div>
   <%# ((FKMModel.Comment)Container.DataItem).FKMUser.Username %>
   <%# ((FKMModel.Comment)Container.DataItem).CommentDate.Value.ToShortDateString() %>
   <%# ((FKMModel.Comment)Container.DataItem).CommentTime %>
</div>

Исключение возникает при первой привязке (FKMUser.Username). Поскольку внешний ключ настроен, у меня не должно возникнуть проблем с доступом к каким-либо свойствам из таблицы Users. Intellisense установил свойство навигации FKMUser и знает свойства этой внешней таблицы. Что здесь происходит ???

Ответы [ 2 ]

3 голосов
/ 27 марта 2010

Возможно, вам понадобится добавить в запрос оператор «Включить» или отключить отложенную загрузку - в следующем вопросе / .answers есть несколько примеров: Entity Framework - Наследование с .Include?

В вашем примере вы хотели бы добавить Включить следующим образом:

IQueryable<Comment> CommentQuery =
            from x in ctx.Comment
            .Include("<name of FK navigation property">)
            where x.SiteID == 101 
            select x;

Или вы можете явно отключить отложенную загрузку для контекста - это зависит от вашего дизайна, так как выполнение полных загрузок графа объекта может быть дорогостоящим. Некоторое время назад я написал сообщение в блоге , в котором рассматриваются некоторые «забавы» ФК в EF v1.

Кроме того, вы можете явно убедиться, что FK (свойство навигации) загружено, специально загружая его, например, при привязке данных.

if (!<entity>.<navigation property>.IsLoaded)   //Ensure the relationship has loaded 
        <entity>.<navigation property>.Load();
0 голосов
/ 27 марта 2010

Это не из-за вашей проблемы с кодированием. Ссылка на ключ сущности может быть нулевой. в базе данных значение внешнего ключа должно быть нулевым. Проверьте состояние нуля, прежде чем что-то делать.

FKMModel.FKMEntities ctx = new FKMModel.FKMEntities();
if(ctx.EnitityKey !=null)
{
        IQueryable<Comment> CommentQuery =
            from x in ctx.Comment
            where x.SiteID == 101 
            select x;
        List<Comment> Comments = CommentQuery.ToList();
        dl_MajorComments.DataSource = Comments;
        dl_MajorComments.DataBind();
}

Это ошибка в платформе сущностей в .net 3.5.

или используйте ключевое слово

IQueryable<Comment> CommentQuery =
                from x in ctx.Comment.Include("Users")
                where x.SiteID == 101 
                select x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...