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。如何存储来自基类的继承数据的主要内容,如果未能解决你的问题,请参考以下文章

EF4 CTP5 代码优先实现中的实体拆分场景

使用实体基类时的 EF CTP5 映射问题

EF CTP5 - 找不到“数据库优先”示例

实体框架代码优先 CTP5:如何定义非原始类型

EF4 CTP5 Code First 方法忽略表属性

WCF 数据服务和 EF4 CTP5,如何为查询配置默认的急切加载模式?