EF6帮助定义我的模型的外键(可选的外键和冲突的多重性)

时间:2013-12-15 12:42:00

标签: asp.net-mvc entity-framework fluent

我是EF6和流畅的API的新手,但我在尝试打扰你之前尝试了所有可能性,但我现在有点困惑。

我有以下型号:

public class Event
{
    public int Id { get; set; }
    [Required]
    public string Label { get; set; }
}

public class Address
{
    public int Id { get; set; }
    [Required]
    public String City { get; set; }

}

这就是我想要做的事情:

  1. 该活动应包含必填字段Address
  2. 地址可用于事件或其他类(例如,我们称之为Person)。因此,它不应该直接绑定到Event
  3. 删除Event(或Person)时,我想级联并删除已关联的Address
  4. 我通过查看文档并在网上搜索,尝试了Fluent API中的许多可能性。尽管如此,我仍然遇到各种各样的问题:冲突的多重性,模型不一致或者无法在删除时级联。

    有人可以帮忙吗?我真的被卡住了! :)

    谢谢!

    !!! UPDATE !!! 根据要求,这是我能找到的最佳解决方案:

    public class Event
    {
        public int Id { get; set; }
        [Required]
        public string Label { get; set; }
        [Required]
        public virtual Address.Address Address { get; set; }
    }
    
    public class Address
    {
        public int Id { get; set; }
        [Required]
        public String City { get; set; }
    }
    

    流畅的代码如下:

    modelBuilder.Entity<Event>()
                .HasRequired(e => e.Address)
                .WithOptional()
                .Map(e => e.MapKey("AddressId"))
                .WillCascadeOnDelete(true);
    

    此实现将Event表中的外键添加到Address表中。但是,删除级联将按以下方向工作:删除地址将删除事件。不幸的是,我试图完成相反的事情:我希望仅在事件发生时删除地址!

    再次感谢你:)

1 个答案:

答案 0 :(得分:0)

你的要求互相争斗。

  • 级联删除是从委托人到依赖,因此当AddressEvent时,Event必须删除Address时,Address必须是<{> em>外国人指的是。)
  • 如果多个班级必须有Address,则其他班级应引用Address,这会使Person成为校长。

还有另一种选择。 Event可以有两个外键,AddressEvent。但这不是很吸引人,因为密钥必须都可以为空,并且没有数据库约束来强制它们是互斥的。

另一种方法是使Person成为复杂类型,因此AddressesEvent表都将包含所有地址列。当然这没有很好地规范化,你不能将Address作为单独的实体来处理,但至少没有级联问题,因为地址是{{1}}记录的一部分。

我认为你最好的选择是让几个类引用{{1}}并编写逻辑来删除孤立地址。