【问题标题】:EF 7 beta 6 : Entities with one to many relationships in EF 7EF 7 beta 6:在 EF 7 中具有一对多关系的实体
【发布时间】:2016-02-02 01:05:19
【问题描述】:

我有一个非常简单的模型:

class Bag
{
    public int Id { get; set; }
    public ICollection<RandomThing> RandomThings { get; set; }
}

class RandomThing
{
    public int Id { get; set; }
    public String Description{ get; set; }
}

我的上下文 OnModelCreating(在 EF 6 中)类似于:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Bag>()
        .ToTable("Bag")
        .HasMany(x => x.RandomThings).WithRequired(x => x.Bag).WillCascadeOnDelete();

    modelBuilder.Entity<RandomThing>().ToTable("RandomThing");
}

据我所知,没有等效的方法可以做到这一点。我知道cascade deletes are not supported。但是,我想知道,对我的代码示例中定义的一对多关系进行建模的最佳方法是什么?似乎所有这些东西都已经消失(或尚未实施)。

我已经看到了一个 DbContext 的示例 (here),与我想要的完全一样,但它实际上是错误的并且不起作用。如果我尝试下载该源代码,设置我的环境,并在包含帖子的博客实体上进行保存,那么这些帖子不会像人们想象的那样被保存。

有什么解决方法吗?

【问题讨论】:

    标签: c# entity-framework entity-framework-core


    【解决方案1】:

    更新:此答案是为 EF7 beta7 编写的。此后 API 发生了变化。有关使用 EF Core 的最新信息,请参阅 http://docs.efproject.net/en/latest/modeling/relationships.html

    原答案

    在 EF 7 中,您可以在 OnModelCreating 方法中配置一对多关系。为此,请向 RandomThing 添加一个属性来表示外键,以及对父类型的 CLR 引用。

    class Bag
    {
        public int Id { get; set; }
        public ICollection<RandomThing> RandomThings { get; set; }
    }
    
    class RandomThing
    {
        public int Id { get; set; }
        public String Description{ get; set; }
    
        public Bag Bag { get; set; }
        public int BagId { get; set; }
    }
    

    在您的上下文中,使用以下设置配置关系:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {  
        modelBuilder.Entity<RandomThing>()
            .Reference(e => e.Bag)
            .InverseCollection(p => p.RandomThings)
            .ForeignKey(e => e.BagId);
    }
    

    旁注:当 EF 7 plans to add support 改为通过属性进行配置时。

    【讨论】:

    • 当我执行 context.Add(bag) 后跟 context.Save() 时,只保存 Bag 实体(只是 Id),RandomThings 集合不会相应地保存。
    • 目前在 EF 7 中,您也需要调用 .Add() 才能到达 RandomThings,但这可能会在即将发布的 beta 版本中发生变化(欢迎享受预发布软件的乐趣)。
    • 非常感谢。我已经这样做了,我只是想知道到目前为止是否有更完整的方法。
    • 您可以在此处关注 .Add() 的更改github.com/aspnet/EntityFramework/issues/2726
    • 在 EF6 中,在 OnModelCreating 中不需要特定定义,而是通过模型属性命名中的某些约定来推断。 (例如 BagId => Bag)将来会支持吗?
    【解决方案2】:

    虽然我根本没有使用过 EF7,但在 EF6 中我会让你的模型看起来像这样:

    class Bag
    {
        public int Id { get; set; }
        public virtual ICollection<RandomThing> RandomThings { get; set; }
    }
    
    class RandomThing
    {
        public int Id { get; set; }
        public String Description{ get; set; }
    
        public int BagId {get; set;}
        [ForeignKey("BagId")]
        Public Bag Bag {get; set;}
    }
    

    这种关系由数据注释处理,您不需要 model builder 来完成此特定任务

    【讨论】:

    • 是的,这在 EF7 中尚不可用,但即将提供支持。
    猜你喜欢
    • 2015-12-08
    • 2016-04-16
    • 1970-01-01
    • 2023-02-10
    • 2022-10-17
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多