Как исключить участника из сопоставления Linq-To-Sql?
У меня есть этот класс:
public class MyClass {
[Column(Name="StoredColumn", DbType="int")]
public int Stored;
public int ForDisplay {
get { return Stored * 1000; }
}
}
Точка ForDisplay
не должна храниться в базе данных - мне просто нужно ее для более удобного кода.
Я пытаюсь запустить SQL-запрос, который возвращает набор строк и получает его InvalidOperationException
:
Невозможно присвоить значение члену "ForDisplay". Он не определяет сеттер.
Я не хочу, чтобы ForDisplay
был затронут Linq-To-Sql. Как сказать Ling-To-Sql не трогать его?
Ответы
Ответ 1
Вам не нужно указывать Linq на Sql, чтобы он не касался свойства "ForDisplay". Обычно все свойства, которые специально не отмечены атрибутом Column
, рассматриваются как переходная часть вашей прикладной логики и не сохраняются или не извлекаются из базы данных.
Однако, если вы хотите получить некоторые записи из базы данных с помощью хранимой процедуры, скажем GetMyClasses
, тогда дизайнер создаст новый класс GetMyClassesResult
. Если вы посмотрите на сгенерированный код, вы заметите, что класс не украшен атрибутом Table
. В этом случае картограф предполагает, что каждое свойство должно быть назначено. Если в запросе есть свойство без соответствующего значения, то он попытается установить свойство по умолчанию (T), но поскольку нет сеттера, исключение будет выбрано.
В любом случае, чтобы сделать длинный рассказ коротким, просто добавив
[Table]
public class MyClass
{
...
}
вашему классу следует исправить проблему.
Ответ 2
Вы можете расширить linq2sql с помощью частичных классов. Ключевым элементом является не изменение исходного класса, а создание дополнительного частичного класса:
public partial class MyClass
{
public int ForDisplay {
get
{
return this._Stored * 1000;
}
}
}
Ответ 3
Попробуйте объявить столбец как вычисленный столбец следующим образом:
public class MyClass
{
[Column(Name="StoredColumn", DbType="int")]
public int Stored;
[Column(Name="ForDisplay", Expression="StoredColumn * 1000")]
public int ForDisplay
{
get { return Stored * 1000; }
}
}
Это должно работать.
Ответ 4
Моя проблема связана с возвращаемым значением из функции значения таблицы, где модель не украшала
[Table]
в классе. Я могу подтвердить, что добавление [Table] против моего дополнительного частичного класса помогло
[Table]
public partial class MyClassFromTVF
{
public int ForDisplay {
get { return Stored * 1000; }
}
}