Подтвердить что ты не робот

Как исключить участника из сопоставления 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 не трогать его?

4b9b3361

Ответ 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; }
        }
}