2

以下のことを手伝ってくれる人はいますか?

モデル

public class Integer
{
    public int IntegerID { get; set; }

    [Required(ErrorMessage = "Enter an integer")]
    [Integer(ErrorMessage = "Enter an integer")]
    public int IntegerValue { get; set; }
    public int IntegerListID { get; set; }

    public virtual IntegerList IntegerList { get; set; }
}

public class IntegerList
{ 
    public int IntegerListID { get; set; }
    public string Direction { get; set; }
    public long Performance { get; set; }
    public virtual ICollection<Integer> Integers { get; set; }

    public IntegerList()
    {
        Integers = new List<Integer>();
    }
}

コントローラ アクション

    public ActionResult XMLexport () {
        Object obj = db.IntegerLists.Include("Integers");
        Serialize(obj);
        return View();
    }
    public static string Serialize(Object obj)
    {
        DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
        MemoryStream memoryStream = new MemoryStream();
        serializer.WriteObject(memoryStream, obj);
        return Encoding.UTF8.GetString(memoryStream.GetBuffer());
    }

ラインで

serializer.WriteObject(memoryStream, obj);

エラーが発生します:

Type 'System.Data.Entity.Infrastructure.DbQuery`1[[IntegerSorter.Models.IntegerList,     IntegerSorter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' is an invalid collection type since it does not have a valid Add method with parameter of type 'IntegerSorter.Models.IntegerList'.

Add メソッドを実装する場所と方法を教えてもらえますか?

アップデート:

変化:

Object obj = db.IntegerLists.Include("Integers");

Object obj = db.IntegerLists.Include("Integers").ToList();

結果:

Type 'System.Data.Entity.DynamicProxies.IntegerList_62F0932A6DFC38A25629DF18911498D42B3785A93BCE8B8D2F77C3363B3F4200' with data contract name 'IntegerList_62F0932A6DFC38A25629DF18911498D42B3785A93BCE8B8D2F77C3363B3F4200:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
4

2 に答える 2

2

この行を変更してみてください:

Object obj = db.IntegerLists.Include("Integers");

これに:

Object obj = db.IntegerLists.Include("Integers").ToList();

これにより、データベース クエリが実行され、 のList<IntegerList>代わりに が表示されDbQuery<IntegerList>ます。これにより、シリアライザーが必要とするものを提供する必要があります (Add(IntegerList)エラーによって要求されたメソッドを使用できるため)。

于 2013-10-14T16:11:44.100 に答える
0

私はグレッグの答えを受け入れましたが、私が取り組まなければならなかったその後の問題を詳述する必要があると感じています:

Type 'System.Data.Entity.DynamicProxies.IntegerList_62F0932A6DFC38A25629DF18911498D42B3785A93BCE8B8D2F77C3363B3F4200' with data contract name 'IntegerList_62F0932A6DFC38A25629DF18911498D42B3785A93BCE8B8D2F77C3363B3F4200:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

で解決しました:

Context.Configuration.ProxyCreationEnabled = false;

その後:

Object graph for type 'System.Collections.Generic.List`1[[IntegerSorter.Models.Integer, IntegerSorter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' contains cycles and cannot be serialized if reference tracking is disabled.

以下のように Integer クラスのナビゲーション プロパティを装飾することで解決されました。

[IgnoreDataMember]
public virtual IntegerList IntegerList { get; set; }
于 2013-10-15T11:44:24.487 に答える