2012-02-07 101 views
0

我有一个项目中的类,我正在建立一个代码优先的风格。问题很简单。有问题的对象是用户和用户类型。对象没有出现在Code First - MVC3项目

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; } 

} 

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始终为空。这让我非常困惑。如果用户类型关键是在用户表备案,为什么我没有得到一个UserType对象我的用户的一部分,当我使用一个标准的LINQ查询一样得到用户:

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

我得到的用户,但user.userType始终为空。

我在这里错过了什么?
我应该建立一个不同的LINQ查询吗?
不应该将userType对象自动包含在User对象中吗?

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

感谢您的帮助!

回答

0

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

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; }