2016-04-16 24 views
1

我有一個簡單的模型用於這篇文章的目的。這是預期的實體框架7 /核心行爲還是錯誤?

兩個實體角色和人物。

public class Role : Entity 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Person> PeopleWithThisRole { get; set; } 
} 

public class Person : Entity 
{ 
    public Guid Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public Guid? RoleId { get; set; } 
} 

如果我從EF上下文中的角色,那麼PeopleWithThisRole集合是空的(除非我.Include他們。正如預期的那樣。

但是,如果我得到的角色,然後我得到了人民如下

var roles = _context.Roles.ToList(); 
    var people = _context.People.ToList(); 

然後roles.PeopleWithThisRole收集完全與人居住,而不必.Include它。

這是預期的行爲還是應該將其作爲錯誤提出來?

感謝

UPDATE

有了非常感謝下面@hvd,我決定保持實體清潔,不能使用[JsonIgnore]屬性,而是映射到DTOS(這不包括那些屬性我不需要在JSON中) - 這可能是正確的方法!

回答

3

這是預期的,也是早期版本EF的工作方式。

您的_context會跟蹤在該上下文中加載的實體,以允許保存更改。在這種情況下,Person對象已加載(根據您的請求),其值RoleId已知。在同一個上下文中,Role值與Id值相同的對象已被加載(同樣在您的請求下)。 EF基於這些ID鏈接內存中的對象。如果您跟蹤發送到服務器的SQL查詢,則應該發現除請求的查詢之外沒有發送任何查詢。

+0

謝謝,我明白了。我檢查了SQL並且你是正確的,它沒有加入。當我從Web API返回JSON時,問題就出現了,我返回的數據比我需要的要多。我可以映射到DTO或在返回之前清除集合,但似乎你幾乎不能控制這個:-( –

+0

@MarkChidlow你可能希望簡單地排除序列化的屬性,怎麼做取決於你的序列化器,但是在JSON中.NET,只需添加'[JsonIgnore]'屬性(如果你有時想要序列化屬性,那麼它仍然是可能的,但它會變得更加棘手。) – hvd

+0

謝謝@hvd - 你一直非常樂於助人。 –

相關問題