【问题标题】:Type Per Table Mapping in CodeFirst in EF 5在 EF 5 中的 Code First 中键入每个表映射
【发布时间】:2013-05-31 08:52:09
【问题描述】:

我有一个类似下面的会员模块(我简化了它)

public class User
{
   public int Id { get; set;}
   public int UserDetailId {get; set;}

   public virtual UserDetail UserDetail {get; set;} 
}

public class UserDetail
{
  public int Id {get; set;}
  public int UserId {get; set;}
  public string UserName {get; set;}
  public string PassWord {get; set;}

  public virtual User User {get; set;}
}

然后我在许多项目中使用这种结构,但有一些改进,如下所示

public class CustomUser : User
{
  public string FirstName {get; set;}
  public string LastName {get; set;}
  public string EMail {get; set;}
}

CustomUser 和 UserDetail 之间的关系应该是一对一的,Discrimininator 字段应该被丢弃。我正在使用流利的 api。但我没能成功。

【问题讨论】:

    标签: c# entity-framework entity-framework-5 code-first


    【解决方案1】:

    只需为每种类型指定表映射:

    modelBuilder.Entity<User>().ToTable("Users");
    modelBuilder.Entity<CustomUser>().ToTable("CustomUsers");
    

    如果要将层次结构存储在单个表中,则需要鉴别器列。但是您可以为此列指定自己的名称和值。这是一个例子:

    modelBuilder.Entity<User>()
                .Map<User>(m => m.Requires("UserType").HasValue(0))
                .Map<CustomUser>(m => m.Requires("UserType").HasValue(1));
    
    modelBuilder.Entity<User>()
        .HasOptional(u => u.UserDetail)
        .WithRequired(ud => ud.User)
        .Map(m => m.MapKey("UserId"))
        .WillCascadeOnDelete(true);
    

    对于这些类

    public class User
    {
        public int Id { get; set; }
        public virtual UserDetail UserDetail { get; set; }
    }
    
    public class CustomUser : User
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string EMail { get; set; }
    }
    
    public class UserDetail
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public string PassWord { get; set; }
        public virtual User User { get; set; }
    }
    

    EF 将生成以下具有一对一关系的表格(UserId 作为 FK):

    【讨论】:

    • 我不想为每个用户类型创建一个表。我只想要一个,它是此示例的 CustomUser。为什么我需要为 User 和 CustomUser 指定映射?
    • @RyuKaplan 目前尚不清楚您想要实现什么。您在询问 Type Per Table Mapping,但现在您说您需要 Type Per Hierarchy Mapping。您能否描述一下您想要实现的目标,以及您现在遇到的具体问题?
    • 很抱歉造成混淆。让我再解释一下。我不想拥有多个用户表。一个应用程序可以直接使用 User 类,但另一个应用程序可以使用继承自 User 类的 CustomUser 类。并且 UserDetail 类始终保持不变并且不会改变。现在我有一个 CustomUser,我希望它与 UserDetail 是一对一的关系。但是他们的外键属性不能像你在图片上看到的那样设置成功。另外我想丢弃鉴别器列,因为我将始终拥有一个用户表。
    • +1 真的很喜欢解决方案。您说“如果我存储多种类型,则需要鉴别器列”。实际上我只需要一种用户类型来存储用户而不是另一种。那么这里的鉴别器列的作用是什么?没有 UserType 为 0,永远都是 1。那么有什么办法可以丢弃它?
    • 好的。我将 User 类作为抽象类,它为我完成了这项工作。但这次我总是会创建一个继承自 User 的 CustomUser。
    【解决方案2】:

    你可以试试看这个one。可能是您在使用 Fluent-API 时遗漏了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多