4

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 }

代わりにベーキングフィールドなどを使ってクラスを作成できることを私は知っていますが、それが私が避けようとしていることです。

3 답변


3

私は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#チームが認識していることなので、次のバージョンではもっと良い解決策があるかもしれません。


  • 次のバージョンがもたらした[<CLIMutable>]だから、あなたは正しかった:) - Bartosz
  • @ Bartosz本当にクール:-)正直なところ、私はこれが2011年4月に追加される予定であることを知りませんでした! - Tomas Petricek

8

それは古いものですが、私は今日同様の問題につまずいた、そしてF#3.0であなたがそれを克服することができるように見える[<CLIMutable>]属性:http://msdn.microsoft.com/en-us/library/hh289724.aspx

このようにして、C#APIがPOCOを必要とするとき、あなたはあなたのF#不変レコードを多くのシナリオで使うことができます。


3

MSDNは、「レコード型では、コンストラクタを定義することはできません」と述べています。

http://msdn.microsoft.com/en-us/library/dd233184.aspx


  • 私はそれに気づかずにその記事を3回読んだと誓ったかもしれません:( - 私はコンストラクタを使うことができないので、あなたはこの問題のための回避策を知ることが起こるべきではない? - ebb

リンクされた質問


関連する質問

最近の質問