Имейте пользовательский 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.