2013-05-31 50 views
1

我有会员模块类似下面(我简化IT)类一表映射在CodeFirst在EF 5

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

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

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

enter image description here

+0

我不想要为每个用户类型创建一个表。我只想要一个,这个例子就是CustomUser。为什么我需要为User和CustomUser指定一个映射? –

+0

@RyuKaplan目前还不清楚你想达到什么目的。您正在询问*每个表格映射的类型*,但现在您说您需要*每个层次结构映射的类型*。你能否描述你想要达到的目标,以及你现在有什么确切的问题? –

+0

对不起,感到困惑。让我再解释一遍。我不想拥有多个用户表。一个应用程序可以直接使用User类,但另一个应用程序可以使用从User类继承的CustomUser类。和UserDetail类总是不变,并没有改变。现在我有一个CustomUser,我希望它与UserDetail是一对一的关系。但是他们的外键属性无法像你在图片上看到的那样成功设置。另外我想丢弃鉴别器列,因为我将始终有一个用户表。 –

0

你可以尝试看看这个one。这可能是因为你在使用Fluent-API时丢失了一些东西。