我正在使用一个遗留数据库,该数据库的结构无法更改(至少现在还没有),它有类似的内容:
**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的新手。
谢谢你, 约什
答案 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的枚举也无法解决问题。枚举将仅支持将单个整数列表示为枚举,但在您的情况下,您需要将许多枚举分解为多个枚举。