Имейте пользовательский Setter для свойства для EF-кода. Первая модельная сущность

Можно ли переопределить или добавить код в setter свойства для объекта модели объекта в 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, и этот набор/получает свойство private/protected. Но кажется, что свойство должно публично создаваться в таблице.

Ответ 1

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

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

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

Ответ 2

Описание

Вы можете игнорировать свойство с помощью 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);
    }
}

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

Ответ 3

Я сделал что-то немного другое. В вашем примере я бы изменил файл сопоставления так, чтобы геттер и сеттер в свойстве, которое сопоставлено с базой данных, были закрытыми и строчными, как показано в 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.