EF 代码优先 CTP5。如何存储来自基类的继承数据
Posted
技术标签:
【中文标题】EF 代码优先 CTP5。如何存储来自基类的继承数据【英文标题】:EF Code First CTP5. How to store the Inheritated data from a baseclas 【发布时间】:2011-03-25 19:50:57 【问题描述】:我有一个包含一些默认数据的用户类。
public class User : BaseEntity
//-- Declaration
private string _firstname;
private string _lastname;
private ICollection<BaseProfile> _profiles = new List<BaseProfile>();
//-- Constructor
public User()
//-- Properties
public string Firstname
get return _firstname;
set _firstname = value; base.Name = string.Format("0 1", this.Firstname, this.Lastname);
public string Lastname
get return _lastname;
set _lastname = value; base.Name = string.Format("0 1", this.Firstname, this.Lastname);
public EMailAddress EmailAddress get; set;
public SocialSecurityNumber SocialSecurityNumber get; set;
public Password Password get; set;
public virtual ICollection<BaseProfile> Profiles get return _profiles; set_profiles = value;
配置文件包含基于用户可以拥有的不同配置文件的不同配置文件数据。如果用户是玩家,那么 Profiles 将包含 ProfilePlayer 类,如果用户是 Trainer,它将包含 ProfileTrainer 类。如果 User 是 Player 和 Trainer,它将包含 2 个配置文件,一个 ProfilePlayer 类和一个 ProfileTrainer 类。此配置文件类将包含为用户可能的不同配置文件指定的信息。
现在我的问题是,我如何告诉 EF 它应该将不同的 BaseProfiles 保存为指定的类型,因为当 EF 为我创建数据库时,即使“真实”类型是 ProfilePlayer,它也会被创建为 BaseProfiles班级。我是否需要手动创建不同的表,然后进行一些映射,或者是否有一种简单的方法告诉 EF 创建不同的配置文件类并将基本配置文件数据保存到正确的表中?
【问题讨论】:
你在使用继承的profile类吗? 是的,我的ProfilePlayer、ProfileTrainer都继承了BaseProfiler。 【参考方案1】:我确实找到了解决问题的方法。
modelBuilder.Entity<Domain.BaseProfile>()
.Map<Domain.Model.ProfilePlayer>(p => p.Requires("Discriminator").HasValue("ProfilePlayer"))
.Map<Domain.Model.ProfileTrainer>(p => p.Requires("Discriminator").HasValue("ProfileTrainer"));
【讨论】:
以上是关于EF 代码优先 CTP5。如何存储来自基类的继承数据的主要内容,如果未能解决你的问题,请参考以下文章