Entity Frameworkを使用するWebアプリケーション(ASP.NET MVC3)を構築しようとしていますが、もう一度壁にぶつかりました。ビュー内のコレクションに対してforeachループを実行しようとすると、次の例外がスローされます。
System.InvalidOperationException: クラス 'GvG.Entities.News'にはありません パラメータのないコンストラクタ
今度は私の質問ですが、どういうわけか私のレコード型にパラメータのないコンストラクタを定義することは可能ですか?
現時点での私のレコードタイプはこんな感じです:
type News = {
mutable ID:int;
mutable Author:string;
mutable Title:string;
mutable Content:string }
代わりにベーキングフィールドなどを使ってクラスを作成できることを私は知っていますが、それが私が避けようとしていることです。
私はF#チームのために行ったいくつかの契約プロジェクトの間に(特にEntity Frameworkのために)これを解決しようとしました、そしてあなたは実験的な解決策をで見つけることができます。F#PowerPackのソース。十分にテストされていません。あなたはそれを自分で作る必要があるでしょう。実験的な解決策は、クエリ内のすべてのF#タプルとF#レコードを他の(変更可能な)型に置き換えてから、結果をレコード/タプルに変換します。
編集あなたの質問でクラスを定義することについての言及を見ていませんでした、しかし私はここに同じ問題を持って来るかもしれない他の人たちのために例を残します。
簡単な回避策はありません。残念ながら、プロパティを使用してクラスを明示的に定義します。
type News() =
let mutable id = 0
let mutable author = ""
let mutable title = ""
let mutable content = ""
member x.ID with get() = id and set(v) = id <- v
member x.Author with get() = author and set(v) = author <- v
member x.Title with get() = title and set(v) = title <- v
member x.Content with get() = content and set(v) = content <- v
これはレコードと比較すると非常に醜いですが、現在のバージョンのF#でそれを行う唯一の方法です。 F#チームが認識していることなので、次のバージョンではもっと良い解決策があるかもしれません。
それは古いものですが、私は今日同様の問題につまずいた、そしてF#3.0であなたがそれを克服することができるように見える[<CLIMutable>]
属性:http://msdn.microsoft.com/en-us/library/hh289724.aspx
このようにして、C#APIがPOCOを必要とするとき、あなたはあなたのF#不変レコードを多くのシナリオで使うことができます。
MSDNは、「レコード型では、コンストラクタを定義することはできません」と述べています。
http://msdn.microsoft.com/en-us/library/dd233184.aspx
[<CLIMutable>]
だから、あなたは正しかった:) - Bartosz