Иметь собственный Setter для свойства для модели EF Code First - PullRequest
13 голосов
/ 24 января 2012

Можно ли переопределить или добавить код в установщик свойства для объекта модели сущности в подходе EF Code First.

например,

public class Contact
{
    [Key]
    public int Id { get; private set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string JobTitle
    {
        get;
        set { // eg. proper case the job title }
    }

}

Я пытался иметь открытое свойство, помеченное как NotMapped.и это установить / получить частное / защищенное свойство, которое есть.Но похоже, что свойство public должно быть создано в таблице.

Ответы [ 3 ]

12 голосов
/ 24 января 2012

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

 private string jobTitle;
 public string JobTitle
 {
      get { return jobTitle; }
      set
      {
           // do your fancy stuff or just jobTitle = value
      }
 }

Помните, что если вы измените значение из db внутри вашего установщика, оно, вероятно, будет сохранено таким образом позже после того, как вы выполните SaveChanges() в контексте.

2 голосов
/ 24 января 2012

Описание

Вы можете игнорировать свойства, используя ModelBuilder и .Ignore(...)

.Ignore (...) Исключает свойство из модели, чтобы оно не отображалось в базе данных.

Пример

public class MyDbContext : DbContext
{
    public DbSet<Contact> Contact { get; set; }
    // other DbSet's

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Contact>().Ignore(x => x.JobTitle);
    }
}

Дополнительная информация

1 голос
/ 02 апреля 2013

Я сделал что-то немного другое. В вашем примере я бы изменил файл сопоставления так, чтобы метод получения и установки свойства, сопоставленного с базой данных, был закрытым и строчным, как показано в dmusial. Затем я создал свойство, которое НЕ было отображено в файле edmx, как показано здесь (примечание: хотя я обычно делал бы поля-члены _jobTitle, я использую генерацию кода, и в EF 5.x запуск с _ недопустим).

    ///<summary>
    /// Private member mapped in .edmx file
    /// Something like:
    /// <Property Name="jobTitle" Type="String" MaxLength="Max" FixedLength="false" 
    /// a:SetterAccess="Private" a:GetterAccess="Private" 
    /// xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration" />
    ///</summary>
    private string jobTitle { get; set; }
    ///<summary>
    /// Publicly visible property that now contains your logic.
    ///</summary>
    public string JobTitle
    {
        get { return jobTitle; }
        set { jobTitle = SetProperCase(value); }
    }

Теперь, когда вызывается SaveChanges, он должен сохранить свойство jobTitle в столбце, в который оно отображается в вашем файле edmx.

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