2016-12-05 16 views
0

背景:エラーエンティティ・フレームワークをシリアライズするオブジェクト

Iは、2つのテーブル(トークンとエリア)とDBからデータを取得するAPIを有します。各トークンには、Areaオブジェクトに関連するAreaIDがあります。まず、Entity Frameworkデータベースを使用しています。

問題:

私は(エリアへの参照が含まれている必要があります)トークンを取得するためにデータベースを照会してみてください。

Error getting value from 'Area' on 'System.Data.Entity.DynamicProxies.Token_51B85DEDCE118919D07024535C24194E890BF0A8499689750190733A8008D739'." 

コード::私は(トリムダウン)DBを照会どこ

public partial class Token 
{ 
    public System.Guid ID { get; set; } 
    public System.DateTime Expiry { get; set; } 
    public System.Guid Reference { get; set; } 
    public string IPAddress { get; set; } 
    public string TokenValue { get; set; } 
    public Nullable<System.Guid> Area_ID { get; set; } 
    public virtual Area Area { get; set; } 
} 



public partial class Area 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 

    public Area() 
    { 
     this.Tokens = new HashSet<Token>(); 
    } 
    public System.Guid ID { get; set; } 
    public string Name { get; set; } 
    public string UriPrefix { get; set; } 
    public string Description { get; set; } 
    public System.DateTime Created { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Token> Tokens { get; set; } 
} 

これは、次のとおりです:EFによって作成されたとしてここ

がモデルです

私はエラーを取得します
using (var dbContext = new APIEntities()) 
{ 
    try 
    { 
     tokenObject = dbContext.Tokens.Where(t => t.TokenValue == decryptedToken).FirstOrDefault(); 
     // the tokenObject is created but the Area property is null. 
    } catch (Exception ex) { 
     string message = ex.Message.ToString(); 
    } 
} 

JSONをシリアル化する方法は次のとおりです。

public HttpResponseMessage LogIntoAppWithToken() 
    { 
     string result = ""; 
     string jsonString = "failed to get JSON"; 
     string message = ""; 
     try 
     { 
      var re = Request; 
      var headers = re.Headers; 
      EncryptedToken encToken = new EncryptedToken(); 
      TokenChecker tokenChecker = new TokenChecker(); 
      encToken.tokenValue = ""; 

      if (headers.Contains("X-TOKEN")) 
      { 
       encToken.tokenValue = headers.GetValues("X-TOKEN").First(); 
      } 

      result = tokenChecker.IsTokenValid(encToken).ToString(); 
      Token retrievedToken = tokenChecker.GetTokenByTokenValue(encToken.tokenValue); 
      jsonString = JsonConvert.SerializeObject(retrievedToken); 
      // ERROR Here ^^ 

     } catch (Exception ex) { 
      message = ex.Message.ToString(); 
     } 
     return Request.CreateResponse(HttpStatusCode.OK, "Token is valid: " + result + ". " + " " + jsonString + " " + " Any error messages: " + message); 
    } 

私がしようとしているもの:

dbContextは、私が使用している作成されたとき:グローバルののApplication_Startで

 var json = config.Formatters.JsonFormatter; 
     json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; 
     config.Formatters.Remove(config.Formatters.XmlFormatter); 

:WebApiConfigで

dbContext.Configuration.ProxyCreationEnabled = false; 
dbContext.Configuration.LazyLoadingEnabled = false; 

.asax:

config.Formatters.JsonFormatter 
    .SerializerSettings 
    .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

私でもtokenObjectからエリアIDを取得し、取得するためにDBを照会しようとしたエリア「手動」を押した後tokenObjectに、この取り出さAreaオブジェクト(nullのバージョンを上書きする)追加:

Area areaObject = dbContext.Areas.Where(a => a.ID == tokenObject.Area_ID).FirstOrDefault(); 
tokenObject.Area = areaObject; 

をこれは自己参照ループエラーを引き起こします。 (このアイデアは、ソリューションとして使用するよりもテストのためのものでした)。

領域をそのプロパティの1つとして含むトークンを取得してJSON文字列としてシリアル化するには、どうすればよいですか?

編集1

@のErikEJの提案で: enter image description here

私はトークンオブジェクトは今Areaオブジェクトが含まれていることに気づくが、そのエリアオブジェクトは、エリアが含まれているトークンが含まれていますか?これはどんどん進んでいきます...

私の設定では、確かに、トークンには領域が含まれていますが、領域にはトークンが含まれてはいけませんか?

答えて

1

Iの周りに検索するのLOTが私のために働いていた別のanswerを見つけた後。

影響を受けるプロパティに[JsonIgnore]属性を追加するだけです。 Areaモデルの私にとって:

[JsonIgnore] 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Token> Tokens { get; set; } 
0

利用を含める:

tokenObject = dbContext.Tokens 
     .Where(t => t.TokenValue == decryptedToken) 
     .Include(t => t.Area) 
     .FirstOrDefault(); 
+0

私はあなたの提案を試して、それに応じて質問を編集しました。 – Ryan

関連する問題