实体框架属性如何工作

时间:2016-05-12 10:10:31

标签: c# entity-framework

以下是在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();
    }

}

我可以请求对差异做出任何好的解释吗?

差异是否与延迟加载与预先加载相关?

哪个更好,为什么?

1 个答案:

答案 0 :(得分:1)

以下是它的样子:

public class User
{
    public int Id { get; set; }

    public int AddressId { get; set; }

    public virtual Address Address { get; set; }    
}


说明:

  1. 我们需要将导航属性标记为virtual,以便在运行时启用EF延迟加载。 EF创建一个继承自用户类的用户代理对象,并将Address标记为virtual,允许EF覆盖此属性并添加延迟加载支持代码。

  2. 将AddressId作为地址导航属性的FK实质上将您的用户地址关联转换为"外键关联"。这些类型的关联是首选,因为它们在更新和修改时更容易使用。

  3. 除非您拥有对象集合形式的导航属性(例如IList<Address>),否则您不需要在构造函数中初始化它。如果您在查询中包含EF,EF会自动为您执行此操作。