实体框架中的可选一对多关系[关闭]

Posted

技术标签:

【中文标题】实体框架中的可选一对多关系[关闭]【英文标题】:Optional One-to-many Relationship in Entity Framework [closed] 【发布时间】:2015-06-01 02:20:12 【问题描述】:

我在让可选的一对多关系正常工作时遇到问题。

我的模型是:

public class Person

    public int Identifier  get; set; 
    ...
    public virtual Department Department  get; set; 


public class Department

    public int Identifier  get; set; 
    ...
    public virtual IList<Person> Members  get; set; 

我想将零或一个Department 分配给Person。分配后,Person 应显示在DepartmentMembers 列表中。

我正在使用 Fluent API 配置 Person,如下所示:

HasKey(p => p.Identifier);
HasOptional(p => p.Department).WithMany(d => d.Members);

还通过配置Department而不是Person尝试了另一种方式:

HasMany(d => d.Members).WithOptional(p => p.Department);

但是两种方式我都得到了例外:

无法确定类型“Person”和“Department”之间关联的主体端。此关联的主体端必须使用关系流式 API 或数据注释显式配置。

当同时配置两者时,我得到:

在类型“Person”上声明的导航属性“Department”已配置有冲突的多重性。

对另一种实体类型使用与 Person 相同的配置有效,但是该实体类型引用自身。

如何正确配置这种关系?

【问题讨论】:

没关系,我从模型中删除了ForeignKeyIndexConvention。再次添加后,它起作用了。 【参考方案1】:

你可以试试这个:

this.HasOptional(s => s.Department)
    .WithMany(s => s.Members)
    .HasForeignKey(s => s.MemberOfDepartment);

【讨论】:

【参考方案2】:
modelBuilder.Entity<Department>().HasMany(x => x.MemberOfDepartment).WithOptional();

【讨论】:

【参考方案3】:

也试试这个:

public class Person

    public int Identifier  get; set; 
    public int DepartmentIdentifier get; set;
    public virtual Department Department  get; set; 


public class Department

    public int Identifier  get; set; 

    public virtual IList<Person> Members  get; set; 

使用 Fluent API 配置 EF Person:

this.HasRequired(p => p.Department).WithMany(d => d.Members).HasForeignKey(p => 
p.DepartmentIdentifier);

this.Property(p => p.DepartmentIdentifier).IsRequired();

【讨论】:

它说 我想将零或一个 Department 分配给 Person

以上是关于实体框架中的可选一对多关系[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

实体框架4.1代码优先中的一对多关系

涉及新实体和一对多关系的核心数据迁移

一对多关系不会在实体框架中检索数据

一对多和递归关系 - 强制设置值

实体框架可选的一对一关系不起作用

(转)Hibernate框架基础——一对多关联关系映射