首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架7:确定关系

实体框架7:确定关系
EN

Stack Overflow用户
提问于 2016-03-15 14:49:28
回答 2查看 3.2K关注 0票数 1

在早期版本的EF中,我可以使用以下代码来实现标识关系:

代码语言:javascript
复制
public class Child
{
    [Key, Column(Order = 1)]
    public virtual int Id { get; set; }

    [Key, Column(Order = 2)]
    public virtual int ParentId { get; set; }
    public virtual Parent Parent { get; set; }
}

它需要很容易地将一个孩子从这样的集合中移除:

代码语言:javascript
复制
var parent = _context.Parents.First();
var child = parent.Children.First();

parent.Children.Remove(child);

_context.SaveChanges();

这种方法在http://www.kianryan.co.uk/2013/03/orphaned-child/ (方法2)中进行了描述。

但是在EF7中,当迁移正在创建时,此代码会引发异常:

执行“解决”操作时引发异常。有关细节,请参阅InnerException。若要设置复合主键,请使用fluent API。

我还尝试使用FluentAPI,如How to define nested Identifying Relationships Entity Framework code first在以下代码中所描述的那样:

代码语言:javascript
复制
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Parent>()
            .HasMany(p => p.Children)
            .WithOne(c => c.Parent);

        modelBuilder.Entity<Child>()
            .HasKey(c => new {c.Id, c.ParentId});

        base.OnModelCreating(modelBuilder);
    }

这种方法允许成功地生成迁移,但是当我试图从Children集合中删除一个子集合时,我得到了以下异常:

System.InvalidOperationException:实体类型‘父’和‘子’之间的关联已经被切断,但是这个关系的外键不能设置为null。如果应删除依赖实体,则设置关系以使用级联删除。

但我不想使用级联删除,我想使用识别关系!

请帮助我理解我做错了什么。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-15 15:00:43

在delete上使用级联,因为这是它的用途:

代码语言:javascript
复制
modelBuilder.Entity<Parent>()
    .HasMany(p => p.Children)
    .WithOne(c => c.Parent);
    .WillCascadeOnDelete(true);

https://msdn.microsoft.com/en-gb/data/jj591620.aspx

票数 3
EN

Stack Overflow用户

发布于 2018-11-20 23:00:51

万一有人看到这个错误,让我告诉你我是如何解决我的错误的:

在进行更新时,在EF上首先需要查询数据库并获取数据模型,然后将域层模型与更改映射到其中(基本上是将字段复制到数据上),最后调用DBContext update方法,然后保存更改。

我的问题是,我的模型(不是数据模型、域模型)上也有子对象。

下面是数据层模型(例如):

代码语言:javascript
复制
public class Parent
{
   public int ChildId {get; set; }

   [ForeignKey("ChildId")]
   public virtual Child Child { get; set; }
}

域层模型应该是这样的:

代码语言:javascript
复制
public class Parent
    {
        public int ChildId { get; set; }
        //public Child Child { get; set; }  // this caused the error, keep reading if you want to know more.
    }

当我看到错误时,我一直在使用Autofac的运行时映射程序将域层模型的属性映射到数据层模型。但是,域层模型中的子层为null,因此它将使数据层无效,从而导致错误:

“实体类型‘父’和‘子’之间的关联已被切断,但此关系的外键不能设置为null。如果应删除从属实体,则设置该关系使用级联删除。”

顺便说一下,在db上下文类中,我定义了以下关系:

代码语言:javascript
复制
modelBuilder.Entity<Parent>()
   .HasOne(a => a.Child)
   .WithMany()
   .HasForeignKey(p => p.ChildId)
   .OnDelete(DeleteBehavior.Restrict);

起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36014595

复制
相关文章

相似问题

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