Запись с беспараметрическим конструктором? - PullRequest
4 голосов
/ 02 апреля 2011

Я пытаюсь создать веб-приложение (ASP.NET MVC3), которое использует Entity Framework, и я снова попал в стену. Выдает следующее исключение при попытке запустить цикл foreach над коллекцией в представлении:

System.InvalidOperationException: класс 'GvG.Entities.News' не имеет конструктор без параметров.

Теперь мой вопрос, возможно ли как-то определить конструктор без параметров для моего типа записи?

Мой тип записи на данный момент выглядит так:

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

Мне известно, что вместо этого я могу создать класс с полями для выпечки и т. Д., Но это то, чего я пытаюсь избежать.

Ответы [ 3 ]

8 голосов
/ 05 сентября 2012

Это старая проблема, но сегодня я столкнулся с подобной проблемой, и, похоже, с помощью F # 3.0 вы можете преодолеть ее с помощью атрибута [<CLIMutable>]: http://msdn.microsoft.com/en-us/library/hh289724.aspx

Таким образом, вы можете использовать свои неизменяемые записи F #во многих случаях, когда C # API требует POCO.

3 голосов
/ 03 апреля 2011

Я пытался решить эту проблему (особенно для Entity Framework) во время какого-то контрактного проекта, который я делал для команды 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 #, поэтому в следующей версии может быть какое-то лучшее решение.

3 голосов
/ 02 апреля 2011

MSDN говорит: «В типе записи вы не можете определить конструктор.»

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...