【问题标题】:Entity Framework 5 using multiple relationships between two POCOsEntity Framework 5 使用两个 POCO 之间的多重关系
【发布时间】:2012-11-30 17:07:49
【问题描述】:

我在两个 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 -> User 的一对一关系。但是,我似乎无法弄清楚如何在配置中指出这一点。

我认为需要的代码:

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; }
}

我认为用户对象不需要更改。

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

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; }
}

【问题讨论】:

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


    【解决方案1】:

    您可能想要WithMany 而不是WithOptionalDependent - 这是一对多的关系,而不是一对一的关系。

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

    编辑
    我认为您缺少 DbContext 类中的 OnModelCreating 覆盖:

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

    【讨论】:

    • 没用。当我仍然只得到两个表(项目和用户)并且看起来像这样。项目项目 ID 名称 描述 开始日期 完成日期 删除 管理用户 ID 管理用户_用户 ID 用户_用户 ID 用户用户 ID 登录 ID 密码 名称_姓_名_中间名_前缀名称_后缀项目_项目 ID
    • @dhamilton:奇怪 - 我刚刚在 LinqPad 中尝试过,我得到了所有三个表:ProjectsUsersProjectUsers
    • @dhamilton:您是否对UserConfiguration 类进行了任何更改?您能否将DbContext 的代码添加到您的问题中,以防万一我遗漏了什么?
    • 我已经在上面添加了 DbContext。
    • @dhamilton:好的,你在哪里将UserConfigurationProjectConfiguration 添加到模型中?我希望看到 OnModelCreating 的覆盖,其中这些类的实例被添加到 modelBuilder.Configurations 集合中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2012-10-27
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多