我正在尝试构建一个使用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 }
我知道我可以创建一个带烘焙场等的课程,但这就是我想要避免的。
答案 0 :(得分:8)
这是一个旧的,但我今天偶然发现了类似的问题,看起来像F#3.0,您可以使用[<CLIMutable>]
属性克服它:http://msdn.microsoft.com/en-us/library/hh289724.aspx
这样,当C#API需要POCO时,您可以在许多场景中使用F#immutable记录。
答案 1 :(得分:3)
MSDN说“在记录类型中,你不能定义构造函数。”
答案 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#团队所知道的,因此在下一个版本中可能会有更好的解决方案。