ASP.NET里面的Entity framework 更新一对多的的两个表利用savechanges()方法怎么实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET里面的Entity framework 更新一对多的的两个表利用savechanges()方法怎么实现相关的知识,希望对你有一定的参考价值。

现在想要插入一条记录,先是在主表里面插入一条,接着是插入对应id的从表数据,想利用context的SaveChanges();方法来实现,我先是在主表里面插入一个entity,接着想在从表里面插入List<entity>,如果只是插入entity则可以成功,插入这个list集合就老是出现exception,求大神们支招啊!!

参考技术A Entity framework是可以自动帮你插入你说的从表的吧

假如你的主表是A 从表是B
那么一般的一对多应该是这样的饿
class A

........//属性
ObjectCollection<B> name;

你只需要吧从表的数据放到ObjectCollection<B> 这个里面,一次插入就好了.
我一般就这样做的本回答被提问者和网友采纳
参考技术B one to many的话,你要向one这端的属性Add进去就可以了,否则你就需要把one的外键id或者实体给many的实体 参考技术C 你可以试试遍历List<entity>,然后循环插入entity
PS:你的从表能获取到主表的主键么?

ASP.NET Entity Framework 6 HashSet 或 List 的集合?

【中文标题】ASP.NET Entity Framework 6 HashSet 或 List 的集合?【英文标题】:ASP.NET Entity Framework 6 HashSet or List for a collection? 【发布时间】:2015-04-24 16:13:46 【问题描述】:

我的 EF 模型如下所示:

public class ContentStatus

    public ContentStatus()
    
        this.Contents = new List<Content>();
    

    public int ContentStatusId  get; set; 
    public string Name  get; set; 
    public virtual ICollection<Content> Contents  get; set; 

但是我也看到了这样的实现:

public class ContentStatus

    public ContentStatus()
    
        this.Contents = new HashSet<Content>();
    

    public int ContentStatusId  get; set; 
    public string Name  get; set; 
    public virtual ICollection<Content> Contents  get; set; 

这是此对象的 DDL:

CREATE TABLE [dbo].[ContentStatus] (
    [ContentStatusId] INT           NOT NULL,
    [Name]            NVARCHAR (50) NOT NULL,
    CONSTRAINT [PK_ContentStatus] PRIMARY KEY CLUSTERED ([ContentStatusId] ASC)
);

谁能告诉我应该使用哪个,甚至有区别,我什么时候使用 List 以及 HashSet 如果适用的话。

谢谢

【问题讨论】:

【参考方案1】:

这取决于您的用例,但在大多数情况下,您只能将一个项目添加到集合中一次,因为例如每个状态只应用于一个内容一次。我怀疑你可以让一个内容在一个状态中出现两次。因此 HashSet 是正确的数据结构,因为它可以防止重复。如果一个项目可以重复,List 是正确的,但我在实践中没有遇到这种情况,甚至不知道 EF 会如何处理它。

作为旁注,我建议您不要在实体中包含项目集合,除非您需要它。例如,如果您正在构建一个 Web 应用程序来列出产品,您可能有一个视图,您可以在其中显示单个产品及其标签。因此,产品应该有一个标签的集合,以使这种情况变得容易。但是,您可能没有显示标签及其产品集合的页面,因此标签不应具有 Products 属性。它只是不关心相关产品。看来这个 Status 实体并不关心它的 Contents 集合。

【讨论】:

【参考方案2】:

所以HashSet&lt;T&gt; 是definition

List&lt;T&gt; 没有这些功能。

所以我想这取决于所需的特性和性能(在小型设备上可以忽略不计)。它们都可以枚举。

性能(尽管可能存在微小差异)将在读取和写入两部分中表现出来。正如 Sean 评论的那样,由于哈希码计算和唯一性比较,写入可能会受到惩罚。但是读取速度非常快 (o(1))。

真的,这完全取决于所需的特性。

在我的项目中,我会使用List&lt;T&gt;,但这是我的惯例。您可以确定自己的约定,只要您坚持。

【讨论】:

HashSet 可以迭代。任何实现IEnumerable 的类都可以,List&lt;T&gt;HashSet&lt;T&gt; 都可以实现它。 我会假设 Hashset 的插入成本更高,因为它确保唯一性,因此必须与其他条目或至少它们的哈希进行比较,但删除成本更低(假设哈希找到项目的速度比枚举列表会做)。 @SeanB 是的,但与小数据集无关。前几天晚上我正在测量数组和哈希集的性能,对于 2000 个项目,我必须以刻度为单位进行测量,以查看一些数字(毫秒不够小) @CallumLinington,公平点,但是你的答案是性能是决定因素的结论是没有实际意义的。 @SeanB 是的,这个答案似乎更像是对该方法的一般答案(我在一年前做过)。

以上是关于ASP.NET里面的Entity framework 更新一对多的的两个表利用savechanges()方法怎么实现的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET-MVC中Entity和Model之间的关系

如何为 ASP.net Core 配置 Entity Framework 6

浅谈最新beta版ASP.NET 5架构Entity Framework 7预览版

在 ASP.NET Core 中使用 Entity Framework 6

更新 ASP.NET Core Entity Framework 中的实体类

如何在 ASP.NET 5 中将 Entity Framework 6 与 MySQL 一起使用?