2013-04-17 3 views
2

Основываясь на сущности Entity Framework, я создал частичный класс для одного из них. Проблема в том, что я хочу добавить код перед возвратом ContentValue. Но это не работает -C# partial class и get accessor

[MetadataType(typeof(ToolTip_Meta))] 
public partial class Tooltip 
{ 
    ..some methods etc 
} 

public class ToolTip_Meta 
{ 
    [Required] 
    public string ContentValue 
    { 
     get 
     { 
      if (!string.IsNullOrEmpty(this.ContentValue)) 
       return this.ContentValue.Replace("\n", "<br/>").Replace("\r", "").Replace("\r", "").Replace("'", "\\'").Replace("\"", "&quot;"); 
      return this.ContentValue; 
     } 
     set { ContentValue = value; } 
    } 
} 

, когда где-то в моем проекте я хочу, чтобы получить значение свойства ContentValue я получаю строку без изменений, я не получаю внутри get аксессору. Как это исправить?

+2

Не могли бы вы создать и использовать новое свойство, которое использует ContentValue в качестве защитника? – Khan

+0

вы вызываете получить свойство ContentValue из свойства get ContentValue? это должно d = не работать наверняка –

+0

Я мог бы, но я хочу быть уверенным, что каждый раз, когда программист получает значение свойства ContentValue, он получает измененную строку – Tony

ответ

3

Я не думаю, что это действительно имеет отношение к частичным классам или метаданным. Ваша проблема на самом деле очень проста.

if (!string.IsNullOrEmpty(this.ContentValue)) 

При доступе к this.ContentValue, он называет этот поглотитель, который затем обращается к this.ContentValue, который вызывает добытчика ... Таким образом, вы будете либо получить StackOverflowException или OutOfMemoryException.

Если у вас нет одной из этих двух ошибок, уточните свой вопрос, чтобы объяснить , как не работает.

2

В конструкторе Framework Entity измените имя поля сгенерированного свойства на ContentValueInternal и отметьте его как имеющим внутренний доступ, а не общедоступный. Это все равно можно отобразить в поле базы данных ContentValue.

Затем в вашем партитурном классе с ручной кодировкой создайте новое общедоступное свойство с именем ContentValue, которое имеет логику, которую вы описываете в своем вопросе, но которая использует свойство ContentValueInternal для внутреннего хранения.

+0

звучит неплохо, но проблема в том, что каждый раз, когда обновляется модель EF , каждый программист должен помнить об изменении этого свойства ContentValueInternal. Но кто-то может забыть это сделать – Tony

+0

Если вы просто делаете «Обновить модель из базы данных» в дизайнере, он должен помнить о сопоставлениях, поэтому вам не нужно постоянно их перезагружать. Если вы используете источник управления, и вы храните edmx с источником, то каждый программист должен использовать одни и те же сопоставления и, следовательно, не нужно менять его отдельно. Если по какой-либо причине отказ не выполняется, и он получает сброс, и кто-то забывает его изменить, тогда компилятор будет жаловаться, потому что у вас будет частичный класс, ссылающийся на поле, которое не существует. Так что этого должно быть достаточно напоминания, чтобы исправить это. –

Смежные вопросы