Mapping 为什么代码优先实体框架会生成外键?

Mapping 为什么代码优先实体框架会生成外键?,mapping,ef-code-first,entity-framework-4.1,Mapping,Ef Code First,Entity Framework 4.1,所以我有 public class User { public int ManagerId { get; set; } public Manager Manager { get; set; } } public class Manager { public User User { get; set; } } modelBuilder.Entity<User>() .HasOptional(x => x.Manager) .WithOptionalDepen

所以我有

public class User
{
   public int ManagerId { get; set; }
   public Manager Manager { get; set; }
}

public class Manager
{
   public User User { get; set; }
}

modelBuilder.Entity<User>()
.HasOptional(x => x.Manager)
.WithOptionalDependent(x => x.User);
公共类用户
{
public int ManagerId{get;set;}
公共管理器{get;set;}
}
公共班级经理
{
公共用户{get;set;}
}
modelBuilder.Entity()
.has可选(x=>x.Manager)
.具有可选依赖性(x=>x.User);
因此,用户有一个可选的管理器,管理器可能有用户,也可能没有用户。这是因为管理器对用户没有外键,但用户对管理器有可为空的外键。但是它会生成外键并将ManagerId作为常规属性。我该如何解决这个问题


干杯,伊恩。

这是一对一的关系。仅当外键构建在主键之上时,它才起作用。你需要这样的东西:

public class User
{
   [Key, ForeingKey("Manager")]
   public int Id { get; set; }
   public Manager Manager { get; set; }
}

public class Manager
{
   public int Id { get; set; }
   public User User { get; set; }
}
如果manager有用户,则该用户必须具有与manager相同的PK值。您将无法在两侧定义此关系(可选),因为它将违反FK。在fluent mapping中,您应该执行以下操作:

modelBuilder.Entity<Manager>()
            .HasOptional(m => m.User)
            .WithRequired(u => u.Manager);
modelBuilder.Entity()
.has可选(m=>m.User)
.需要(u=>u.Manager);

删除了我的答案,因为它是错误的。我不认为这是一对一的关系,这是Ladislav回答中解释的另一个故事。