【问题标题】:Entity framework map entity to multiple tables?实体框架将实体映射到多个表?
【发布时间】:2015-08-17 03:08:31
【问题描述】:

我在使用 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);
    }

我已经对其进行了测试,但它没有按预期工作。我总是收到这条消息:

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

我错过了什么吗?

【问题讨论】:

  • 也许有人有一个实际的解决方案 - 但我认为您将不得不走与 Role 相同的道路(外键,...)
  • 用户是否继承了用户类的用户?或者您的代码对于所有这些实体是否只有一个用户?你可以在这里查找继承策略:blogs.msdn.com/b/alexj/archive/2009/04/15/… 我看到你有一个角色实体,我不认为我会如何解决它......我会有一个基础 Person,让 User、Admin 和 Staff 继承从那个抽象类。然后我会使用每个类型的表 (TPT) 来避免我的数据库中出现多个空值。

标签: c# entity-framework


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2013-02-18
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多