对象没有出现在Code First - MVC3项目中

时间:2012-02-07 23:48:58

标签: asp.net-mvc-3 code-first

我有一个项目,其中包含我正在以Code First风格构建的项目中的类。问题很简单。有问题的对象是User和userType。

public class User
{
    [Key]
    public int id { get; set; }

    [DisplayName("User Name")]
    [Required(ErrorMessage = "User Name is required.")]
    public string userName { get; set; }

    [DataType(DataType.Password)]
    [DisplayName("Password")]
    [Required(ErrorMessage = "Password is required.")]
    public string userPassword { get; set; }

    [DisplayName("First Name")]
    public string first_Name { get; set; }

    [DisplayName("Last Name")]
    public string last_Name { get; set; }

    [DisplayName("Email")]
    public string email { get; set; }

    [DisplayName("Zip")]
    public string Zip { get; set; }

    [DisplayName("Address")]
    public Address address { get; set; }

    [DisplayName("Birthdate")]
    public DateTime dateOfBirth { get; set; }

    [DisplayName("Home phone")]
    public string homePhone { get; set; }

    [DisplayName("Cell phone")]
    public string cellPhone { get; set; }

    [DisplayName("Remember me")]
    public bool persistCookie { get; set; }

    public UserType userType { get; set; }

    public int status { get; set; }

}

AND

public class UserType
{
    [Key]
    public int id { get; set; }
    public string typeName { get; set; }

}

我生成这样的用户:

userType = (from ret in db.UserTypes where ret.typeName.Equals("Contractor") select ret).FirstOrDefault();
                user.userType = userType;
                user.status = 1;
                db.Users.Add(user);
                db.SaveChanges();

数据库模式似乎支持UserTypes表的外键。

一切都在添加和数据库中运行良好我看到一个带有相应userType_id的用户记录。

稍后我检索用户时会出现问题。我的User.userType始终为null。这让我很困惑。如果userType键位于记录的Users表中,当我使用标准LINQ查询获取该用户时,为什么我不能将userType对象作为User的一部分获取:

User user = (from ret in db.Users where ret.userName.Equals(userIn.userName) && ret.userPassword.Equals(userIn.userPassword) select ret).FirstOrDefault();

我获得了User,但user.userType始终为null。

我在这里想念的是什么? 我应该构建不同的LINQ查询吗? 不应该将userType对象自动包含在User对象中吗?

我认为Code First编程风格是一种很好的方法,但这个问题令我感到困惑。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您需要告诉EF使用userType方法急切加载导航属性Include

User user = (from ret in db.Users.Include(u => u.userType)
             where ret.userName == userIn.userName 
             && ret.userPassword == userIn.userPassword select ret)
             .FirstOrDefault();

或者将userType属性设为虚拟,以便EF延迟加载它。

public virtual  UserType userType { get; set; }