使用旧数据库和常量的实体框架模型映射

时间:2017-02-01 02:38:03

标签: sql-server entity-framework entity-framework-6 legacy-database

我在超过15岁的数据库上使用EF6。我没有做出这个架构决定。我使用EF的所有经验都是代码优先的,我自己创建的模型。

我们的一个表有一个参考表,只有选择需要一些信息。这些映射永远不会用于更新/插入/删除。

我有两个实体。我的主要表格:

public class QualParam
{
    [Key]
    public string MillId { get; set; } 
    [Key]
    public string Qparam { get; set; } 
    public string ValueNum { get; set; } 
    public string ActiveFlag { get; set; } 
    public int ModifiedTimestamp { get; set; } 
    public int CreatedTimestamp { get; set; } 
    public decimal SbIncrement { get; set; } 
    public string QualityDesc { get; set; }
    public string TypeCode { get; set; }

    public QualParamHeader QualParamHeader { get; set; }
    public virtual UnitMeasure UnitMeasure { get; set; } 
}

和参考表:

public class UnitMeasure
{
    [Key]
    public string UnitOfMeasure { get; set; } 
    public int ModifiedTimestamp { get; set; } 
    public int CreatedTimestamp { get; set; } 
    public string BaseUnits { get; set; } 
    public string UnitDesc { get; set; } 
    [Key]
    public string TableName { get; set; }
    public string RollWeightFlag { get; set; } 
    public string MetricFlag { get; set; } 
    public string MxActionCode { get; set; }
    [Key]
    public string TypeCode { get; set; }  
    public byte[] RecordVersion { get; set; } 

    public List<QualParam> QualParams { get; set; }
}

QualParam可能有一个UnitMeasure,而UnitMeasure可以有很多QualParams,很简单,对吗?

在SQL中,连接就这样完成了

  SELECT * 
  FROM qual_params AS q
  LEFT JOIN unit_measure AS u
   ON u.unit_meas = q.unit_meas
   AND u.table_name = 'qual_params'
   AND u.type_code = q.type_code

所以是的,有一个常量,表名,是的,从源到引用表的键不匹配,甚至在db中都没有枚举。遗产。

我们的Db背景 -

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new QualParamsConfiguration());
    modelBuilder.Configurations.Add(new UnitMeasureConfiguration());
    base.OnModelCreating(modelBuilder);
}

我正在使用自动生成的配置 -

public QualParamConfiguration()
        : this("dbo")
    {
    }

    public QualParamConfiguration(string schema)
    {
        ToTable(schema + ".qual_params");
        HasKey(x => new { x.MillId, x.Qparam });

        Property(x => x.Qparam).HasColumnName(@"qparam").IsRequired().IsFixedLength().IsUnicode(false).HasColumnType("char").HasMaxLength(10).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
        Property(x => x.ValueNum).HasColumnName(@"value_num").IsRequired().IsFixedLength().IsUnicode(false).HasColumnType("char").HasMaxLength(9);
        Property(x => x.ActiveFlag).HasColumnName(@"active_flag").IsRequired().IsFixedLength().IsUnicode(false).HasColumnType("char").HasMaxLength(1);
        Property(x => x.ModifiedTimestamp).HasColumnName(@"ts_modified").IsRequired().HasColumnType("int");
        Property(x => x.CreatedTimestamp).HasColumnName(@"ts_create").IsRequired().HasColumnType("int");
        Property(x => x.SbIncrement).HasColumnName(@"sb_increment").IsRequired().HasColumnType("decimal").HasPrecision(7, 3);
        Property(x => x.QualityDesc).HasColumnName(@"quality_desc").IsRequired().IsFixedLength().IsUnicode(false).HasColumnType("char").HasMaxLength(50);
        Property(x => x.MillId).HasColumnName(@"mill_id").IsRequired().IsFixedLength().IsUnicode(false).HasColumnType("char").HasMaxLength(10).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);


        this.HasRequired(a => a.QparamHeader).WithMany(b => b.QualParams).HasForeignKey(c => c.Qparam).WillCascadeOnDelete(false);
    }

最后一个导航写了自己,原因很明显。简单的关系。

这一个,不是那么多。我对所有事情持开放态度 - 我现在非常清楚我必须创建一个单独的模型来实现这一目标。

我见过的示例.Map必须来自旧版本的EF,因为我无法使用许多方法。是否有可能实现这种关系?

0 个答案:

没有答案