【问题标题】:MVC3 Optional Bidirectional relationship code firstMVC3 可选双向关系代码优先
【发布时间】:2012-05-30 18:14:25
【问题描述】:

我拥有的是类似的东西

public class BuildingUnit
{
    public int ID { get; set; }
    *irrelevant stuff removed*
    public virtual BuildingUnitInsurance UnitInsurance { get; set; }
}


public class BuildingUnitInsurance
{
    public int ID { get; set; }
    *irrelevant stuff removed*
    public virtual BuildingUnit BuildingUnit { get; set; }
}

我想要做的是从 BuildingUnit 到 BuildingUnitInsurance 的关系是可选的,但如果它确实存在,那么从 BuildingUnitInsurance 到 BuildingUnit 的关系必须存在。我已经用注释和流利的 api 尝试了一大堆东西,但我还没有真正得到任何地方。

这里的实际业务案例是有一个显示来自 BuildingUnit 类的信息的视图,然后在该页面上可以单击一个按钮并弹出一个模式以添加保险信息。单击该模式上的“添加保险”按钮会将保险信息发布到控制器,此时应该保存它,并且应该在 BuildingUnit 和 BuildingUnitInsurance 之间创建关系。对控制器代码的任何帮助也会很棒,因为我真的不知道我必须在那里做什么才能使这些关系发生。

【问题讨论】:

    标签: asp.net-mvc-3 model-view-controller ef-code-first bidirectional-relation


    【解决方案1】:

    您需要为 BuildingUnit 建立一对零或一的关系,并为 BuildingUnitInsurance 建立一对一的关系。下面的代码应该对您有所帮助,如果没有在Configuring Relationships 上阅读更多内容。

    public class BuildingUnit
    {
        [Key]
        public int ID { get; set; }
    
        [ForeignKey("UnitInsurance")]
        public virtual int? UnitInsuranceId { get; set; }
    
        public virtual BuildingUnitInsurance UnitInsurance { get; set; }
    }
    
    
    public class BuildingUnitInsurance
    {
        [Key]
        public int ID { get; set; }
    
        [Required]
        [ForeignKey("BuildingUnit")]
        public virtual int BuildingUnitId { get; set; }
    
        public virtual BuildingUnit BuildingUnit { get; set; }
    }
    

    然后在您的 OnModelCreating 处理程序中:

    modelBuilder.Entity<BuildingUnit>.HasOptional(x => x.UnitInsurance).WithRequired();
    modelBuilder.Entity<BuildingUnitInsurance>.HasRequired(x => x.BuildingUnit).WithOptional();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多