1

ここにある例を使用して、 Neo4jグラフデータベース用のNeo4jClientを試しています。

次の非常に単純なコードでは、次のようになります。

var client = new GraphClient(new Uri("http://localhost:7474/db/data"));
client.Connect();

var myNodeReference = client.Create(new MyNode { Foo = "bar" });
var myNode = client.Get<MyNode>(myNodeReference);

最後の行(.Get)で、次のエラーがスローされます。

An item with the same key has already been added.

(が最初で唯一のメソッドであっても、同じエラーがスローGetされます。以前に作成した既存のキーを使用してノードを取得しています)。

スタックトレースを調べたところ、Neo4j dbではなくNeo4jClientに関連していることがわかりました。これは、辞書に追加するときにスローされるエラーのように見えるためです。

 at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector)
   at Neo4jClient.Deserializer.CommonDeserializerMethods.GetPropertiesForType(Type objType) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CommonDeserializerMethods.cs:line 344
   at Neo4jClient.Deserializer.CommonDeserializerMethods.Map(Object targetObject, JToken parentJsonToken, CultureInfo culture, IEnumerable`1 typeMappings, Int32 nestingLevel) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CommonDeserializerMethods.cs:line 228
   at Neo4jClient.Deserializer.CommonDeserializerMethods.CreateAndMap(Type type, JToken element, CultureInfo culture, IEnumerable`1 typeMappings, Int32 nestingLevel) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CommonDeserializerMethods.cs:line 210
   at Neo4jClient.Deserializer.CommonDeserializerMethods.SetPropertyValue(Object targetObject, PropertyInfo propertyInfo, JToken value, CultureInfo culture, IEnumerable`1 typeMappings, Int32 nestingLevel) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CommonDeserializerMethods.cs:line 132
   at Neo4jClient.Deserializer.CommonDeserializerMethods.Map(Object targetObject, JToken parentJsonToken, CultureInfo culture, IEnumerable`1 typeMappings, Int32 nestingLevel) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CommonDeserializerMethods.cs:line 234
   at Neo4jClient.Deserializer.CustomJsonDeserializer.Deserialize[T](RestResponse response) in c:\TeamCity\buildAgent\work\460e89b30f53245b\Neo4jClient\Deserializer\CustomJsonDeserializer.cs:line 59
   at RestSharp.RestClient.Deserialize[T](IRestRequest request, RestResponse raw)

関連する場合、これらはNuGetのパッケージバージョンです。
<package id="Neo4jClient" version="1.0.0.397" targetFramework="net40-Client" />
<package id="Newtonsoft.Json" version="4.0.8" targetFramework="net40-Client" />
<package id="RestSharp" version="102.7" targetFramework="net40-Client" />

私はここで何が間違っているのですか?

MyNodeクラスの編集:

[JsonObject]
public class MyNode
{
    [JsonProperty("Bar")]
    public string Foo { get; set; }

    [JsonIgnore]
    public string Bar { get; set; }
}
4

1 に答える 1

3

[JsonProperty("Bar")]あなたが本当にそれをする必要がない限り、それが問題を引き起こしているので、私は少し外します。デシリアライザーは、実際のプロパティ「Bar」とJsonProperty「Bar」を区別できません。

外すと、コードは正常に機能します。

Jsonのものを使用したい場合は、別のNodeオブジェクトを作成できます。

public class OtherNode { public string Bar { get;set;} }

そしてそれに逆シリアル化します:

var nodeReference = client.Create(new MyNode { Foo = "blah" });
var retrieved = client.Get<OtherNode>(nodereference);

そしてそれはうまくいくでしょう。

于 2012-07-25T14:47:06.377 に答える