EF 6 Codefirst - 使用流式 API 为基类中定义的属性设置默认值

Posted

技术标签:

【中文标题】EF 6 Codefirst - 使用流式 API 为基类中定义的属性设置默认值【英文标题】:EF 6 Codefirst -Setting default value for a property defined in base class using fluent API 【发布时间】:2015-09-05 20:23:06 【问题描述】:

我有一个基类,它具有类似的审计属性

public abstract class BaseModel

    [Column(Order = 1)] 
    public long Id  get; set; 
    public long CreatedBy  get; set; 
    public DateTime CreatedDate  get; set; 
    public long ModifiedBy  get; set; 
    public DateTime ModifiedDate  get; set; 
    public bool IsActive  get; set; 

我所有的 poco 类都派生自这个类。

我正在尝试为 IsActive 属性设置默认值。我不热衷于使用注释,因此我是否可以使用流利的 API 来处理这个问题。

我试过了,但它不起作用。似乎它创建了一个名为 BaseModel 的新表

modelBuilder.Entity<BaseModel>()
    .Property(p => p.IsActive)
    .HasColumnAnnotation("DefaultValue", true);

任何人都可以在这里提出一种方法吗?

【问题讨论】:

***.com/questions/19554050/… 【参考方案1】:

没有办法做到这一点。它不能使用实体框架设置默认值。相反,您可以使用构造函数

public abstract class BaseModel

    protected BaseModel()
    
        IsActive = true;
    

【讨论】:

【参考方案2】:

我通过覆盖 SaveChanges 方法解决了这个问题。请参阅下面的解决方案。

    解决方案说明

    i) 覆盖 DbContext 类中的 SaveChanges 方法。

    public override int SaveChanges()
    
        return base.SaveChanges();
    
    

    ii) 编写逻辑来设置默认值

    public override int SaveChanges()
    
        //set default value for your property
        foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("YOUR_PROPERTY") != null))
        
            if (entry.State == EntityState.Added)
            
                if (entry.Property("YOUR_PROPERTY").CurrentValue == null)
                    entry.Property("YOUR_PROPERTY").CurrentValue = YOUR_DEFAULT_VALUE;
            
        
    
        return base.SaveChanges();
    
    

    示例

    i) 创建基类

      public abstract class BaseModel
      
           [Column(Order = 1)] 
           public long Id  get; set; 
           public long CreatedBy  get; set; 
           public DateTime CreatedDate  get; set; 
           public long ModifiedBy  get; set; 
           public DateTime ModifiedDate  get; set; 
           public bool IsActive  get; set; 
      
    

    ii) 覆盖 SaveChanges

    public override int SaveChanges()
    
    
        //set default value for IsActive property
        foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("IsActive") != null))
        
            if (entry.State == EntityState.Added)
            
                if(entry.Property("IsActive").CurrentValue == null)
                    entry.Property("IsActive").CurrentValue = false;
            
        
    
        return base.SaveChanges();
    
    

【讨论】:

以上是关于EF 6 Codefirst - 使用流式 API 为基类中定义的属性设置默认值的主要内容,如果未能解决你的问题,请参考以下文章

EF6 CodeFirst使用MySql

EF-CodeFirst-基础

在Oracle中使用Entity Framework 6 CodeFirst

EF实体框架之CodeFirst七

EF Codefirst入门之创建数据库

使用带有 EF 6 Code First 的 Oracle MangedDataAccess “提供者没有返回 providermanifesttoken”