实体框架将实体映射到多个表?

时间:2015-06-03 04:50:19

标签: c# entity-framework

我在使用EF时遇到了问题。我有以下情况:

  

表用户:用户名,密码,RoleId,IsActive,CreatedDate,ActivedDate

     

表格管理员:用户名,姓名

     

表员工:用户名,姓名,职位,电话

从这个数据库模式我想通过合并表数据生成以下实体:

function get_select_option($table,$id,$name,$selected=0){
            $this->db->where('column_name','your_value');
            $query = $this->db->get($table);
            $select = '<option value="">SELECT</option>';
            if($query->num_rows()>0){
                foreach($query->result_array() as $row){
                $selected_option = ($selected==$row[$id]) ? ' selected="selected" ':' ';
                    $select.='<option value="'.$row[$id].'" '. $selected_option.'>'.trim(strtoupper($row[$name])).'</option>';
                }
            }
            return $select;
        } 

配置类:

public class User
{
    [Key]
    public string Username { get; set; }
    public string Password { get; set; }
    public int RoleId { get; set; }
    public bool IsActive { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime ActivedDate { get; set; }

    public string Name { get; set; }
    public string Phone { get; set; }
    public string Position { get; set; }

    [ForeignKey("RoleId")]
    public Role Role { get; set; }
}

我已经测试了它,但它没有按预期工作。我总是得到这样的信息:

  

“用户”类型的属性只能映射一次。非键属性“名称”不止映射一次。确保Properties方法仅指定每个非键属性一次。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

问题在于NameAdmin中的两个Staff当然不能同时映射到Name中的一个User属性。

但是您可以拥有两个不同的名称属性,并将两个表映射到两个表中的相同列名:

User的变化:

public class User
{
    [Key]
    public string Username { get; set; }
    ...
    public string AdminName { get; set; }
    public string StaffName { get; set; }
    ...
}

映射片段:

.Map(map =>
{
    map.Properties(p => new
    {
        p.Username,
        p.AdminName
    });
    map.Property(p => p.AdminName).HasColumnName("Name");
    map.ToTable("Admin");
}).Map(map =>
{
    map.Properties(p => new
    {
        p.Username,
        p.StaffName,
        p.Phone,
        p.Position
    });
    map.Property(p => p.StaffName).HasColumnName("Name");
    map.ToTable("Staff");
});