我有一个项目,其中包含我正在以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编程风格是一种很好的方法,但这个问题令我感到困惑。
感谢您的帮助!
答案 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; }