1

我正在开发一个实体框架代码优先项目,该项目具有相当复杂的数据模型,在 SQL Server 2008 上部署得非常好。

但是,在为某些本地端到端测试创建 SQL Server CE 数据库时,我在 EF 创建数据库时收到以下错误消息:

System.Data.SqlServerCe.SqlCeException: The referential relationship will result in a cyclical reference that is not allowed. [ Constraint name = FK_Sites_Persons_PersonId ].

ManyToManyCascadeDeleteConvention在我的 DataContext 模型创建方法中禁用了,所以这不是问题的原因。我遇到的问题是,有问题的关系在 SQL Server 2008 数据库中看起来很好——据我所知,它似乎是一个普通的外键,我看不到任何东西朝另一个方向回流,尽管它不是不可能有更长路径的循环引用。我不知道为什么 CE 会失败而 2008 年会成功。

4

2 回答 2

3

事实证明这个问题很简单地解决了——虽然我已经禁用了,但ManyToManyCascadeDeleteConvention我还需要禁用它OneToManyCascadeDeleteConvention以避免循环引用问题。

于 2012-10-10T11:08:14.117 回答
2

您还可以考虑明确定义级联更新和删除,而不是全局禁用它们。假设一个模型:

namespace Models
{
    public class Parent
    {
        public Parent() { this.Children = new HashSet<Child>(); }

        public int id { get; set; }
        public string description { get; set; }

        public ICollection<Child> Children { get; set; }
    }

    public class Child
    {
        public int id { get; set; }
        public string description { get; set; }

        public Parent Parent { get; set; }
    }
}

在您的上下文中覆盖 OnModelCreating 并使用 fluent api 来指定给定关系的级联选项。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Parent>().HasMany<Child>(p => p.Children).WithRequired(c => c.Parent).WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }

当然这是一个简单的例子,但是您可以将相同的原则应用于您的下层实体,并专门排除导致循环引用的级联删除。

于 2012-10-14T17:58:02.300 回答