在EF 5中的Code First中键入每表映射

时间:2013-05-31 08:52:09

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

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

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。但我不能成功地做到这一点。

The Table Creation

2 个答案:

答案 0 :(得分:2)

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

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

如果要在单个表中存储层次结构,则需要

Discriminator列。但您可以为此列指定自己的名称和值。这是一个例子:

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):

enter image description here

答案 1 :(得分:0)

您可以尝试查看此one。可能是您在使用Fluent-API时遗漏了一些东西。