实体框架5使用两个POCO之间的多个关系

时间:2012-11-30 17:07:49

标签: entity-framework code-first poco entity-framework-5

我在两个POCO对象上应用多个关系(或可能是外键)时遇到问题。我已经建立了多对多的第一个关系,并且在创建数据库时,它创建了关系所需的三个表(Projects,Users和ProjectsUsers)。

到目前为止

代码:

public class Project
{
    public int ProjectId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? CompletionDate { get; set; }
    public bool Deleted { get; set; }

    public ICollection<User> Users { get; set; }
}

public class User
{
    public User()
    {
        Name = new Name();
    }

    public int UserId { get; set; }
    public string LoginId { get; set; }
    public string Password { get; set; }
    public Name Name { get; set; }

    public ICollection<Project> ManagedProjects { get; set; }
}

public class ProjectConfiguration : EntityTypeConfiguration<Project>
{
    public ProjectConfiguration()
    {
        HasMany(x => x.Users)
            .WithMany(x => x.ManagedProjects);
    }
}

public UserConfiguration()
{
    HasMany(x => x.ManagedProjects)
        .WithMany(x => x.Users);
}

现在我想添加Project.ManagingUser的可选一对一关系 - &gt;用户。但是,我似乎无法弄清楚如何在配置中指出这一点。

我认为需要的代码:

public class Project
{
    public int ProjectId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? CompletionDate { get; set; }
    public bool Deleted { get; set; }

    public int? ManagingUserId { get; set; }
    public User ManagingUser { get; set; }

    public ICollection<User> Users { get; set; }
}

我认为User对象不需要改变。

这显示了我最后一次尝试映射新关系:

public ProjectConfiguration()
{
    HasMany(p => p.Users)
        .WithMany(u => u.Projects);

    this.HasOptional(p => p.ManagingUser)
        .WithOptionalDependent()
        .Map(m=>m.MapKey("ManagingUserId"))
        .WillCascadeOnDelete(false);
}

创建数据库时发生了什么,我现在最终只有两个表(项目和用户)。看起来它只是试图建立一对一的关系。

有人可以告诉我我错过了什么吗?

Richard我没有更改UserConfiguration,下面是DbContext:

public class MyDbContext : DbContext
{
    public MyDbContext() : base(Properties.Settings.Default.ConnectionString)
    {
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Project> Projects { get; set; }
}

1 个答案:

答案 0 :(得分:2)

你可能想要WithMany而不是WithOptionalDependent - 这是一个:很多关系,而不是一个:一个。

HasOptional(p => p.ManagingUser)
   .WithMany()
   .HasForeignKey(m => m.ManagingUserId)
   .WillCascadeOnDelete(false);

修改
我认为您错过了OnModelCreating类的DbContext覆盖:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   base.OnModelCreating(modelBuilder);
   modelBuilder.Configurations.Add(new ProjectConfiguration());
   modelBuilder.Configurations.Add(new UserConfiguration());
}