背景:エラーエンティティ・フレームワークをシリアライズするオブジェクト
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
私はトークンオブジェクトは今Areaオブジェクトが含まれていることに気づくが、そのエリアオブジェクトは、エリアが含まれているトークンが含まれていますか?これはどんどん進んでいきます...
私の設定では、確かに、トークンには領域が含まれていますが、領域にはトークンが含まれてはいけませんか?
私はあなたの提案を試して、それに応じて質問を編集しました。 – Ryan