2016-12-01 179 views
2

你好關係的不需要的加載,在EF核心

我有問題,EF核心的功能 - 它可以自動綁定相關實體一起當實體某處獨立地連接到當前dbCotnext。

假設以下兩個實體:

public class Seller { 
     public Guid Id {get;set;} 
     public List<Product> Products {get;set;} 
    } 

    public class Product { 
     public Guid Id {get;set;} 
     public Guid SellerId {get;set;} 
     public Seller Seller {get;set;} 
    } 

和Controller(只是想象)一些代碼:

var seller = DbContext.Sellers.FirstOrDefault(e => e.Id == someId); 
var products = DbContext.Products.All(t => t.SellerId == someId); 
return StatusCode(200, products); 

返回的JSON會像

[ 
    { 
     "id": "1234", 
     "sellerId": "5678", 
     "seller": { 
      "id" : "5678", 
      "products": ["(muted reference loop exception from json converter here.)"] 
     } 
    } 
] 

但我不希望賣家被包含在每個產品中。如果我這樣做,我會打電話Products.Include(...)爲那個或別的東西。 我不想通過實體進行爬網並且無法導航屬性。 我不想用[JsonIgnore]將其隱藏,因爲有時必須包含關係。 當發生這種情況時,我也不想手動分離每個實體。

問題是,有沒有什麼辦法可以禁用或解決此問題?

感謝

+0

嘗試'公開名單產品{獲得;設置;}'變化可空 –

回答

3

不,你不能/不應該。你需要單獨的dto類(es)。

Newtonsoft.Json負責對象序列化,它決定哪些屬性必須被序列化。您只能使用它的屬性來控制它的行爲。你不能從EF控制它:)

而且只要你希望有時包括財產,有時不需要 - 你需要兩個不同的類(每個類都有正確的屬性)。其他一切都是黑客。 DTO,Automapper和所有這些東西 - 歡迎您。

順便說一句,具有不同的外部API和內部數據存儲類,可以讓您輕鬆更改一個而不會破壞其他(將來)。

1

你必須改變模型類和使用可空類型

public class Product { 
     public Guid Id {get;set;} 
     public Guid SellerId {get;set;} 
     public Seller? Seller {get;set;} 
    } 
+1

問題是關於'Product.Seller' – Dmitry

0

你嘗試過在啓動類此配置:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 

    services.AddMvc().AddJsonOptions(a => a.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore); 

    // other code 
} 
+1

問題不是循環,關於「賣方」的財產。 – Dmitry

+0

賣方是產品內的導航屬性,您可以禁用引用循環來序列化結果而不用循環引用,我同意你關於DTO,但並不總是所有開發人員都使用DTO,它將要避免的第一個問題版本循環引用的行爲以及您可以處理的這段代碼 –

+0

'Project.Seller'不是循環引用('Project.Seller.Projects')。 – Dmitry