为EF Code First模型实体提供属性的自定义Setter

时间:2012-01-24 16:23:38

标签: entity-framework ef-code-first

是否可以在EF Code First方法中为实体模型对象的属性设置器覆盖或添加代码。

e.g。

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,并设置/获取私有/受保护属性。但似乎该财产必须公开才能在表格中创建。

3 个答案:

答案 0 :(得分:11)

如果需要,您可以在那里编写逻辑,只需将属性转换为非自动属性,然后像对普通属性一样执行检查。

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

请记住,如果您在setter中更改了db中的值,那么在您对上下文执行SaveChanges()之后,它可能会稍后保存。

答案 1 :(得分:1)

描述

您可以使用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);
    }
}

更多信息

答案 2 :(得分:1)

我做了一些略有不同的事情。 在您的示例中,我将更改映射文件,以便映射到数据库的属性上的getter和setter为私有和小写,就像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文件中映射到的列中。