首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架核心代码首先-0.1到多个关系和级联删除

实体框架核心代码首先-0.1到多个关系和级联删除
EN

Stack Overflow用户
提问于 2016-06-29 15:02:48
回答 1查看 567关注 0票数 0

我正在尝试创建一个由实体框架核心支持的注释系统,在这个系统中,不同类型的多个实体可以将注释附加到它们。

这些是我的实体。(在实际应用程序中,总共大约有7种不同的关系,但通常情况是这样的)

代码语言:javascript
运行
复制
public class Comment : IEntityBase
{
    public int Id { get; set; }

    public int? FreezerId{ get; set; }
    public Freezer Freezer { get; set; }
    public int? BoxId{ get; set; }
    public Box Box{ get; set; }
    public string Author { get; set; }
    public DateTime CreatedAt { get; set; }
    public string Content { get; set; }
}

public class Freezer: IEntityBase
{
    public int Id { get; set; }

    public string Name { get; set; }
    public string Location { get; set; }
    public ICollection<Box> Boxes{ get; set; }
    public ICollection<Comment> Comments { get; set; }
}

public class Box: IEntityBase
{
    public int Id { get; set; }

    public Freezer Freezer{get; set;}
    public int FreezerId{get; set;}
    public string Data{ get; set; }
    public ICollection<Comment> Comments { get; set; }
}

我希望评论实体是附加到一个冰箱或一个盒子,但不是同时两个。

我在fluent API中定义了以下关系:

代码语言:javascript
运行
复制
 builder.Entity<Box>(boxBuilder=>
        {
            boxBuilder.HasOne(box=> box.Freezer)
                .WithMany(freezer => freezer.boxes)
                .HasForeignKey(box => box.FreezerId)
                .IsRequired()
                .OnDelete(DeleteBehavior.Cascade);

            boxBuilder.HasMany(box => box.Comments)
                .WithOne(comment => comment.Box)
                .HasForeignKey(comment => comment.BoxId)
                .OnDelete(DeleteBehavior.Cascade);
        });

 builder.Entity<Freezer>(freezerBuilder =>
        {
            freezerBuilder.HasMany(freezer=> freezer.Comments)
                .WithOne(comment => comment.Freezer)
                .HasForeignKey(comment => comment.FreezerId)
                .OnDelete(DeleteBehavior.Cascade);
        });

当我试图将数据库更新到这个模型时,我会得到以下错误:

代码语言:javascript
运行
复制
System.Data.SqlClient.SqlException: Introducing FOREIGN KEY constraint 'FK_Comment_Boxes_BoxId' on table 'Comment' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

我认为错误来自于注释类中的Box和Freezer属性,而不是可选的,这将使这成为一个1到多个关系,而不是一个0..1到多个关系,这正是我想要的。

对于实体框架6,我只使用.HasOptional()方法,但在实体框架核心中不存在这种方法

我认为解决这一问题的一种方法是只对注释类进行子类,并为每个实体创建一个惟一的注释类,然后将外键和引用属性移动到该子类。

但我觉得我不应该这样做。

EN

回答 1

Stack Overflow用户

发布于 2016-06-29 16:16:36

您必须禁用级联delete(DeleteBehavior.Restrict),然后它将对您有效:

代码语言:javascript
运行
复制
 modelBuilder.Entity<Box>(boxBuilder =>
        {
          boxBuilder.HasOne(box => box.Freezer)
              .WithMany(freezer => freezer.Boxes)
              .HasForeignKey(box => box.FreezerId)
              .IsRequired()
              .OnDelete(DeleteBehavior.Cascade);

          boxBuilder.HasMany(box => box.Comments)
              .WithOne(comment => comment.Box)
              .HasForeignKey(comment => comment.BoxId)
              .OnDelete(DeleteBehavior.Restrict);
        });

        modelBuilder.Entity<Freezer>(freezerBuilder =>
        {
          freezerBuilder.HasMany(freezer => freezer.Comments)
              .WithOne(comment => comment.Freezer)
              .HasForeignKey(comment => comment.FreezerId)
              .OnDelete(DeleteBehavior.Restrict);
        });
        base.OnModelCreating(modelBuilder);
      }

用法:

代码语言:javascript
运行
复制
using (var myConext = new MyDbContext())
      {
        myConext.Database.EnsureCreated();
        myConext.Boxes.Add(new Box() {Freezer =  new Freezer()});
        myConext.SaveChanges();
      }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38103391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档