Свойства ассоциации не загружаются на объект - PullRequest
1 голос
/ 11 января 2010

У меня есть три связанных объекта, лучше всего описанных этой схемой:

альтернативный текст http://thehashtable.com/wp-content/uploads/2010/01/Enttities.png

Когда я загружаю пользователя, используя следующий код, загружается объект User, то есть не ноль, но свойства Role и Department объекта User равны нулю, несмотря на то, что запись базы данных пользователя имеет действительные значения FK для этих ассоциаций.

using (var productionEntities = new ProductionEntities())
{
    var userName = GetUserName();
    User u = (from usr in productionEntities.UserSet
              where usr.UserName == userName
              select usr).FirstOrDefault();
    if (u == null)
    {
        throw new KpiSecurityException("No local database entry found for user.") { UserName = userName };
    }
    return u.Department.DeptName;
}

ASIDE: Я прошел всю эту миссию только потому, что ASP.NET MembershipProvider не поддерживает пользовательские «метаданные», такие как отдел, и мне пришлось бы также использовать ProfileProvider, за счет огромного раздувания БД.

Ответы [ 2 ]

3 голосов
/ 11 января 2010

вы должны явно загрузить это свойство

User u = (from usr in productionEntities.UserSet
          where usr.UserName == userName
          select usr).FirstOrDefault();

if (u == null)
{
        throw new KpiSecurityException("No local database entry found for user.") { UserName = userName };
}

if (!u.RoleReference.IsLoaded)
{ u.RoleReference.Load(); }

if (!u.DeparmentReference.IsLoaded)
{ u.DeparmentReference.Load(); }

или включите эти объекты в ваш запрос

User u = (from usr in productionEntities.UserSet.Include("Role").Include("Department")
          where usr.UserName == userName
          select usr).FirstOrDefault();
1 голос
/ 11 января 2010

Так как вам нужно только название отдела, просто project , что вышло; таким образом, вы запрашиваете БД только один раз:

using (var productionEntities = new ProductionEntities())
{
    var userName = GetUserName();
    var u  = (from usr in productionEntities.UserSet
              where usr.UserName == userName
              select new
              {
                  DeptName = usr.Department.DeptName
              }).FirstOrDefault();
    if (u == null)
    {
        throw new KpiSecurityException("No local database entry found for user.") { UserName = userName };
    }
    return u.DeptName;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...