2017-05-17 60 views
0

我得到EF的自我引用問題,我試圖結束它,但仍然允許服務能夠執行一個GET {[FromODataUri]詮釋鍵}傳遞一個密鑰和如有必要,返回一個IQuerable對象來獲取擴展表。以下是這些表格的精簡版本。有關如何處理這種情況的任何建議。EF WebAPI自回參考循環

public class People 
{ 
public int PeopleId {get;set;} 
public string PeopleName {get;set;} 

public int? ProductId{get;set;} 

public virtual Product Product{get;set;} 
} 

ProductId是產品中的PK,但不是必需的。按照慣例,它不必被PK DataAnnotation覆蓋。

public class Product 
{ 
    public Product() 
    { 
     PeopleCollection = HashSet<People>(); 
    } 
    public int ProductId {get;set;} 
    public string ProductName {get;set;} 
    public virtual ICollection<People> Peoples{get;set;} 
} 
+0

的WebAPI被序列化您的回覆,但是產品參考人,其中引用了一個產品,它引用的人,其引用的產品。您可能需要重新考慮是否有必要在您的People類中使用Product,或者可能會將您的實體映射到避免此循環引用的DTO。 – Tom

+0

我應該補充說,這可能是啓用了「延遲加載」的症狀,因爲序列化程序正在查看屬性並加載實體。 – Tom

+0

可能的重複http://stackoverflow.com/questions/19467673/entity-framework-self-referencing-loop-detected – Tom

回答

0

我一段時間後想通了這一點。如果您從APIController繼承,但是如果您切換到從ODataController繼承,則一切正常。

所以

public class MyController : ApiController 
    { 
    ..... Bunch of code here 
    } 

public class MyController : ODataController 
    { 
    ..... Bunch of code here 
    } 
0

在這種情況下,我建議使用DTO的或使用匿名對象,例如:

public IHttpActionResult Get() { 
    var response = db.YourTable.Select(x=>new{ 
     x.PeopleId, 
     x.PeopleName, 
     x.ProductId, 
     Product= new { 
     x.ProductId, 
     x.ProductName 
     } 
    }).toList(); 
    return Ok(response); 
} 

這就是我如何與匿名對象做到這一點,如果你想使用DTO的你只需要映射他們,希望這是你在找什麼。

對於剛剛特定ID:

public IHttpActionResult Get(int id) { 
    var response = db.YourDb.Select(x=>new{ 
     x.PeopleId, 
     x.PeopleName, 
     x.ProductId, 
     Product= new { 
     x.ProductId, 
     x.ProductName 
     } 
    })Where(x=>x.PeopleId == id).toList(); 
    return Ok(response); 
} 

注意,這種方法是使用查詢字符串參數

+0

這不會總是返回所有關聯的表?例如,如果我翻轉這個arround,我做了一個產品'code var rslt = db.Products.Select(x => new {x.ProductId,x.ProductName,new List (){y = y.PeopleId ,y.PeopleName,y.ProductId}; code'會在每次調用中帶回所有產品和所有人? –

+0

vs使用Odata Query,在那裏我可以讓GET產品它只會返回我的產品,它不會' t返回任何關聯的數據除非我將?$ expand = People添加到我的QueryString –

+0

@JoeRicklefs yes它會,如果你想在.toList()this之前搜索一個特定的id add:Where(x => x.PeopleId = = key).toList(), –