1

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

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。但我无法成功。

表创建

4

2 回答 2

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 将生成以下具有一对一关系的表(使用UserIdas FK):

在此处输入图像描述

于 2013-05-31T09:18:07.250 回答
0

你可以试试看这个。可能是您在使用 Fluent-API 时遗漏了一些东西。

于 2013-05-31T09:09:31.473 回答