Как исключить участника из сопоставления Linq-To-Sql? - PullRequest
12 голосов
/ 07 декабря 2011

У меня есть этот класс:

public class MyClass {
    [Column(Name="StoredColumn", DbType="int")]
    public int Stored;

    public int ForDisplay {
       get { return Stored * 1000; }
    }
}

Дело в том, что ForDisplay не должен храниться в базе данных - мне просто нужен более удобный код.

Я пытаюсь запустить SQL-запрос, который возвращает набор строк, и получить это InvalidOperationException:

Невозможно присвоить значение элементу 'ForDisplay'. Он не определяет сеттер.

Я не хочу, чтобы Linq-To-Sql тронул ForDisplay. Как сказать Ling-To-Sql не трогать его?

Ответы [ 4 ]

7 голосов
/ 15 декабря 2011

Вам не нужно указывать Linq для Sql, что он не должен касаться свойства "ForDisplay". Обычно все свойства, которые специально не помечены атрибутом Column, рассматриваются как временная часть логики приложения и не сохраняются и не извлекаются из базы данных.

Однако, если вы хотите извлечь некоторые записи из базы данных с помощью хранимой процедуры, скажем, GetMyClasses, тогда дизайнер создаст новый класс GetMyClassesResult. Если вы посмотрите на сгенерированный код, то заметите, что класс не имеет атрибута Table. В этом случае маппер предполагает, что каждое свойство должно быть назначено. Если в запросе есть свойство без соответствующего значения, то преобразователь попытается установить для свойства значение по умолчанию (T), но, поскольку нет установщика, будет выдано исключение.

В любом случае, если коротко, просто добавив

[Table]
public class MyClass
{
  ...
}

к вашему классу следует исправить проблему.

1 голос
/ 07 декабря 2011

Вы можете расширить linq2sql частичными классами. Ключевым элементом является не изменение исходного класса, а создание дополнительного частичного класса:

 public partial class MyClass
 {
    public int ForDisplay {   
       get
       {
           return this._Stored * 1000; 
       }   
    }   
  }
0 голосов
/ 03 августа 2015

Моя проблема была связана с возвращаемым значением из функции табличных значений, когда модель не украшала

[Table]

в классе.Я могу подтвердить, что добавление [Table] против моего дополнительного неполного класса сработало

[Table]
public partial class MyClassFromTVF
{
        public int ForDisplay {
             get { return Stored * 1000; }
        }
}
0 голосов
/ 07 декабря 2011

Попробуйте объявить столбец как вычисляемый столбец следующим образом:

public class MyClass 
{ 
    [Column(Name="StoredColumn", DbType="int")]     
    public int Stored;      

    [Column(Name="ForDisplay", Expression="StoredColumn * 1000")]
    public int ForDisplay 
    {        
        get { return Stored * 1000; }     
    } 
} 

Это должно работать.

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