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

C# 实体框架将实体映射到多个表?,c#,entity-framework,C#,Entity Framework,我在使用EF时遇到了一个问题。我有以下情况: 表用户:用户名、密码、RoleId、IsActive、CreatedDate、ActivedDate 表管理员:用户名、名称 表职员:用户名、姓名、职位、电话 根据此数据库架构,我希望通过合并表数据生成以下实体: public class User { [Key] public string Username { get; set; } public string Password { get; set; } publ

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

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

表管理员:用户名、名称

表职员:用户名、姓名、职位、电话

根据此数据库架构,我希望通过合并表数据生成以下实体:

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; }
}
配置类:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .Map(map =>
            {
                map.Properties(p => new
                {
                    p.Username,
                    p.Password,
                    p.RoleId,
                    p.IsActive,
                    p.CreatedDate,
                    p.ActivedDate
                });
                map.ToTable("User");
            })
            .Map(map =>
            {
                map.Properties(p => new
                {
                    p.Username,
                    p.Name
                });
                map.ToTable("Admin");
            }).Map(map =>
            {
                map.Properties(p => new
                {
                    p.Username,
                    p.Name,
                    p.Phone,
                    p.Position
                });
                map.ToTable("Staff");
            });

        base.OnModelCreating(modelBuilder);
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Map(Map=>
{
属性(p=>new
{
p、 用户名,
p、 密码,
p、 罗莱德,
p、 我很活跃,
p、 创建日期,
p、 活性酸
});
地图。可移动(“用户”);
})
.Map(Map=>
{
属性(p=>new
{
p、 用户名,
p、 名字
});
地图总表格(“管理”);
}).Map(Map=>
{
属性(p=>new
{
p、 用户名,
p、 名字,
p、 电话,
p、 位置
});
地图总表格(“工作人员”);
});
基于模型创建(modelBuilder);
}
我已经测试过了,但没有达到预期效果。我总是收到这样的信息:

类型“User”的属性只能映射一次。非键属性“Name”已映射多次。确保Properties方法只指定每个非键属性一次


我遗漏了什么吗?

问题是
Admin
Staff
中的两个
Name
当然不能同时映射到
User
中的一个
Name
属性

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

用户的更改

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");
});

也许有人有一个实际的解决方案,但我认为你必须走与
角色
(外键,…)相同的道路。用户是否继承了用户类的用户?或者您的代码对于所有这些实体只有一个用户?您可以在这里查找继承策略:我看到您有一个角色实体,我不认为我会如何解决它。。。我将有一个基本人员,并让用户、管理员和工作人员从该抽象类继承。然后我会使用每类型表(TPT)来避免数据库中的几个空值。