用无参数构造函数记录?

时间:2011-04-02 12:09:19

标签: entity-framework asp.net-mvc-3 f#

我正在尝试构建一个使用Entity Framework的Web应用程序(ASP.NET MVC3),而且我又一次碰壁了。当尝试在视图中对集合运行foreach循环时,它抛出以下异常:

  

System.InvalidOperationException:The   “GvG.Entities.News”班没有   无参数构造函数。

现在是我的问题,是否有可能以某种方式在我的记录类型上定义无参数构造函数?

目前我的记录类型如下:

type News = { 
    mutable ID:int; 
    mutable Author:string; 
    mutable Title:string; 
    mutable Content:string }

我知道我可以创建一个带烘焙场等的课程,但这就是我想要避免的。

3 个答案:

答案 0 :(得分:8)

这是一个旧的,但我今天偶然发现了类似的问题,看起来像F#3.0,您可以使用[<CLIMutable>]属性克服它:http://msdn.microsoft.com/en-us/library/hh289724.aspx

这样,当C#API需要POCO时,您可以在许多场景中使用F#immutable记录。

答案 1 :(得分:3)

MSDN说“在记录类型中,你不能定义构造函数。”

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

答案 2 :(得分:3)

我在为F#团队做的一些合同项目中试图解决这个问题(特别是对于实体框架),你可以在F# PowerPack sources找到一个实验解决方案。它尚未经过全面测试。你必须自己建造它。实验解决方案用其他(可变)类型替换查询中的所有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#团队所知道的,因此在下一个版本中可能会有更好的解决方案。