实体框架代码第一种映射卷积遗留数据库链接表的方法?

时间:2011-12-04 01:22:25

标签: entity-framework-4.1

我正在使用一个遗留数据库,该数据库的结构无法更改(至少现在还没有),它有类似的内容:

**Profile**:
profile_id
first_name
last_name

**OneBigLookupTableToRuleThemAll**:
lookup_id (PK)
category_id (PK) (refers to a recrod in a OneBigCategoryTableToRuleThemAll)
description (basically a label)

**ProfileProperties**:
property_key (PK GUID)
profile_id  
lookup_id 

UNIQUE constraint on profile_id, lookup_id

作为两个类别的示例:

Degrees (MD, PhD, MS, MPH, etc) -- cat_id 1, for example
Job Responsibilities (Statistician, Medical Doctor, Epidemiologist, etc) -- cat_id 2

所以,在Lookup表中,我们最终会得到这样的东西:

lookup_id, cat_id, description
1        , 1     , MD
2        , 1     , PhD
3        , 1     , MS
4        , 1     , MPH
5        , 2     , Statistician
6        , 2     , Medical Doctor
7        , 2     , Epidemiologist

因此,在ProfileProperties表中,我们最终得到的结果如下:

property_key, profile_id, lookup_id
some guid     , 1         , 1        -- MD degree
some guid     , 1         , 4        -- MPH degree
some guid     , 1         , 6        -- Medical Doctor

我想有这样一个实体:

public class Profile {
  public int ProfileId { get; }
  public string FirstName { get; set; }
  public string LastName { get; set; }

  public ICollection<JobResponsibility> JobResponsibilities { get; set; }
  public ICollection<Degree> Degrees { get; set; }
}

public class JobResponsibility {
 public int Id { get; set; }
 public string Description { get; set; }
}

public class Degree {
 public int Id { get; set; }
 public string Description { get; set; }
}

- 实际上,在Id的setter中,我想将值限制为数据库中的一个实际值,尽管我不确定我是否会进行全面的Enum类型支持(我知道代码首先不支持)

我相信其中一个EntityFramework映射方案应该能够解决这个问题,但是我无法弄清楚我需要做些什么才能让它工作。

任何人都有关于这种情况我可以阅读的任何提示或资源吗?我认为它实际上最终会非常基本,但我是EF的新手。

谢谢你, 约什

1 个答案:

答案 0 :(得分:1)

我不认为任何实体框架映射(特别是如果我们谈论流利/代码优先)能够直接映射 - 我只是测试了继承的方法,但它没有用。 EF在很大程度上取决于数据库的设计方式。在你的情况下,你最有可能会这样结束:

public class Profile
{
    public int ProfileId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<ProfileProperty> Properties { get; set; }
}

public class ProfileProperty
{
    public Guid PropertyId { get; set; }
    public int ProfileId { get; set; }
    public int PropertyId { get; set; }
    public virtual Profile Profile { get; set; }
    public virtual Property Property { get; set; }
}

public class Property
{
    public int LookupId { get; set; }
    public int CategoryId { get; set; }
    public string Description { get; set; }
}

现在,如果你想拥有像Degrees这样的属性,你必须添加非映射属性,如:

public IEnumerable<Property> Degrees
{ 
    get { return Properties.Where(p => p.Property.CategoryId == 1)
                           .Select(p => p.Property);
} 

它仅适用于读取,但不适用于修改属性。对于修改,您需要更复杂的逻辑来在真实Properties集合中构建正确的结构。

即使支持计划使用.NET 4.5的枚举也无法解决问题。枚举将仅支持将单个整数列表示为枚举,但在您的情况下,您需要将许多枚举分解为多个枚举。