以下是在Entity Framework中定义Entity类的四种不同方法。有人能告诉我每种方法的工作方式有何不同,并建议使用哪种方法?
// Approach 1
public class User
{
public int Id { get; set; }
public Address Address { get; set; }
}
// Approach 2
public class User
{
public int Id { get; set; }
public Address Address { get; set; }
public User()
{
this.Address = new Address();
}
}
// Approach 3
public class User
{
public int Id { get; set; }
public virtual Address Address { get; set; }
}
// Approach 4
public class User
{
public int Id { get; set; }
public virtual Address Address { get; set; }
public User()
{
this.Address = new Address();
}
}
我可以请求对差异做出任何好的解释吗?
差异是否与延迟加载与预先加载相关?
哪个更好,为什么?
答案 0 :(得分:1)
以下是它的样子:
public class User
{
public int Id { get; set; }
public int AddressId { get; set; }
public virtual Address Address { get; set; }
}
的说明:强>
我们需要将导航属性标记为virtual
,以便在运行时启用EF延迟加载。 EF创建一个继承自用户类的用户代理对象,并将Address标记为virtual,允许EF覆盖此属性并添加延迟加载支持代码。
将AddressId作为地址导航属性的FK实质上将您的用户地址关联转换为"外键关联"。这些类型的关联是首选,因为它们在更新和修改时更容易使用。
除非您拥有对象集合形式的导航属性(例如IList<Address>
),否则您不需要在构造函数中初始化它。如果您在查询中包含EF,EF会自动为您执行此操作。