在这篇文章中,我们将为您详细介绍使用EntityFrameworkFluent语法或内联语法编写递归CTE的内容,并且讨论关于fluentscheme语言的相关问题。此外,我们还会涉及一些关于c#–E
在这篇文章中,我们将为您详细介绍使用Entity Framework Fluent语法或内联语法编写递归CTE的内容,并且讨论关于fluent scheme语言的相关问题。此外,我们还会涉及一些关于c# – Entity-framework-7将Fluent API配置组织到一个单独的类中、c# – 使用Entity Framework T4 POCO、c# – 如何使用Entity Framework Code First Fluent API仅在连接表上级联删除、Entity FrameWork (实体框架) 是以 ADO.NET Entity FrameWork , 简称为 EF的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 使用Entity Framework Fluent语法或内联语法编写递归CTE(fluent scheme语言)
- c# – Entity-framework-7将Fluent API配置组织到一个单独的类中
- c# – 使用Entity Framework T4 POCO
- c# – 如何使用Entity Framework Code First Fluent API仅在连接表上级联删除
- Entity FrameWork (实体框架) 是以 ADO.NET Entity FrameWork , 简称为 EF
使用Entity Framework Fluent语法或内联语法编写递归CTE(fluent scheme语言)
我对SQL和实体框架(ADO.NET实体映射)中的 递归
都是陌生的。我正在进行评论管理,其中有一个Comments
表,并且该表包含列NewsID, CommentID, ParentCommentID,IndentLevel, CreatedTime
。
我正在尝试获取特定新闻项目的评论列表,其中所有评论均根据父项和创建时间下的子项进行排列,如下所示:
CommentID | time | ParentCommentIDGuid1 | t1 | nullGuid4 | t4 | Guid1Guid2 | t2 | nullGuid3 | t3 | Guid2
必须优先考虑子级父母关系,然后是创建的时间。
到目前为止,我所依靠的是(来自互联网资源和以前的stackoverflow Q / A)
- 如图所示,这些递归查询很慢。并且使用Entity Framework进行此操作甚至更慢。但这是可以实现的。
- 因此,可以通过在SQL Server中创建存储过程并使用功能导入来调用它来完成。另一件事是在实体框架中使用Linq。
- 在SQL Server中,它以这种格式使用
SQL:
WITH cte_name ( column_name [,...n] ) AS ( CTE_query_definition –- Anchor member is defined. UNION ALL CTE_query_definition –- Recursive member is defined referencing cte_name. ) -- Statement using the CTE SELECT * FROM cte_name
- 但是在尝试之前,我想尝试一下Linq。
为此,我参考了我有这个主意的链接:https :
//stackoverflow.com/a/6225373/892788
但是我试图理解代码却徒劳。有人可以给我关于在Entity Framework中编写递归CTE的更好详细的解释吗?
private IEnumerable<NewsComment> ArrangeComments(IEnumerable<NewsComment> commentsList, string parentNewsComntID, int level) { Guid parentNewsCommentID; if (parentNewsComntID != null) { parentNewsCommentID = new Guid(parentNewsComntID); } else parentNewsCommentID = Guid.Empty; return commentsList.Where(x => x.ParentCommentID == parentNewsCommentID).SelectMany(x => new[] { x }.Concat(ArrangeComments(commentsList, x.NewsCommentID.ToString(), level + 1));}
我在方法内部使用以下方法:
return ArrangeComments(commentList,null , 0);
我已经尝试过了,但似乎一无所获。尽管有关于SQL递归的解释,但是Linq的示例较少,并且由于不那么熟悉,对我来说也很模糊。有人可以帮我理解Linq中的CTE递归很棒吗
提前致谢
答案1
小编典典AFAIK在LINQ和EF中均不支持递归CTE。解决方案是将CTE作为视图公开。有关使用EF Code
First和Migrations进行递归或分层查询的文章,介绍了如何使用EF
Code First迁移来部署这种视图。
尝试通过进行递归客户端迭代来模拟CTE并不能扩展到大型数据集,并导致与服务器之间的交流。请注意,您的EF代码是如何IEnumerable
不返回的IQueryable
,这意味着它将实现每个级别,然后将每个条目的下一个级别串联
为一个单独的请求 。基于LINQ的解决方案将适用于条目数有限的浅层次结构(并且请注意,许多项目 可以
具有这种数据布局,用户帖子/答案是典型示例),但是在具有许多元素的深层次结构中会崩溃。
c# – Entity-framework-7将Fluent API配置组织到一个单独的类中
以下是如何使用EF6执行此操作的示例:
ModelConfigurations.cs
public class ModelConfigurations : EntityTypeConfiguration<Blog> { ToTable("tbl_Blog"); HasKey(c => c.Id); // etc.. }
并从OnModelCreating()调用它
protected override void OnModelCreating(DbModelbuilder modelBuilder) { modelBuilder.Configurations.Add(new ModelConfigurations()); // etc... }
在EF7上,我无法解析EntityTypeConfiguration?从单独的类实现流畅的API调用的正确方法是什么?
解决方法
public class BlogConfig { public BlogConfig(EntityTypeBuilder<Blog> entityBuilder) { entityBuilder.HasKey(x => x.Id); // etc.. } } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); new BlogConfig(modelBuilder.Entity<Blog>()); }
c# – 使用Entity Framework T4 POCO
我听说Entity Framework T4 POCO是一个解决方案,但我无法找到有关它的完整信息.有没有人有更多细节与我分享?
提前致谢
解决方法
有一个教程如何通过现有数据库生成POCO类.
c# – 如何使用Entity Framework Code First Fluent API仅在连接表上级联删除
这是我的两个POCO课程:
public class Foo { public int FooId; public string FooDescription; public IList<Bar> Bars; } public class Bar { public int BarId; public string BarDescription; }
现在,我只有一个从Foo到Bar的导航属性.那是因为在我真实的场景中,任何人从Bar到Foo都没有意义.从Foo到Bar的关系实际上是0,n,这意味着Foo的一个实例不需要Bar的实例.
我现有的数据库在这两个表之间有一个连接表.此表如下所示:
create table Foo_Bar( FooId int not null,BarId int not null );
因为我不想在我的项目中创建这样的POCO类,所以我映射了这样的表:
modelBuilder.Entity<Foo>() .HasMany(t => t.Bars) .WithMany() .Map(m => { m.ToTable("Foo_Bar"); m.MapLeftKey("FooId"); m.MapRightKey("BarId"); });
这适用于插入.实体在Foo上插入,然后在现有的Foo_Bar表上插入.
但是当我删除Foo时,我想删除连接表上的记录,但不删除子表上的记录.意思是我想要删除Foo_Bar上的记录,但不要将此级联扩展到Bar.
这样的映射可能吗?我应该提一下,在我的上下文中,我删除了OnetoManyCascadeDeleteConvention和ManyToManyCascadeDeleteConvention,因为99%的时间我不会使用级联删除.这是一个具体情况.
通过跟踪Entity Framework生成的sql,我还注意到如果我检索一个Foo实例并将其中的所有Bars设置为EntityState.Deleted,EF将删除Foo_Bar和Bar中的两个记录.我要提到的最后一件事是我在一个断开连接的场景中工作.
我尝试搜索这个,但似乎我没有使用正确的关键字,因为在这种情况下我找不到任何人.在这一点上,我看到的唯一解决方案是映射一个FooBar类,但我希望有一种方法可以做到这一点.
– 编辑
看来我的删除方法起初是错误的.当我尝试删除时,我没有传递Foo的实例,其中的Bar列表已填满.在更改之后,Entity Framwork为列表中的每个Bar创建一个delete语句.我仍然有更新问题,如同时添加和删除项目.会做更多的测试并发布在这里.
提前致谢.
解决方法
But when I delete a Foo,I would like to delete the records on the
join table but not on the child table. Meaning I want to delete
records on Foo_Bar but not to extend this cascade to Bar.Is such a mapping possible?
这实际上是唯一可行的映射.您不能将级联删除扩展到Bar表,因为在关系中(从数据库模式的角度来看),Foo_Bar连接表是关系中的依赖项,而Bar是主体.通常,cacscading delete仅在删除主体时有效,但在删除从属时不会生效.
因此,您不必担心在删除Foo时可能会删除Bar,并且您不必为此应用任何特殊设置.
但是,当您删除ManyToManyCascadeDeleteConvention时,您会遇到问题.它针对整个模型进行全局操作,并且没有选项可以针对特定的多对多关系再次启用级联删除. (对于多对多关系,没有WillCascadeOnDelete(true),就像一对多或一对一的关系一样.)
您确定在模型中真的需要删除ManyToManyCascadeDeleteConvention吗?我从来没有遇到一个模型,当删除其中一个连接的实体(Foo或Bar)时,不删除连接表中的相关条目是有意义的.
Entity FrameWork (实体框架) 是以 ADO.NET Entity FrameWork , 简称为 EF
Entity FrameWork (实体框架) 是以 ADO.NET Entity FrameWork , 简称为 EF
Entity FrameWork 的特点
1. 支持多种数据库(MSSQL、Oracle、Mysql 和 DB2)
2. 强劲的映射引擎,能很好地支持存储过程
3. 提供 Visual Studio 集成工具,进行可视化操作
4. 能够与 ASP.NET、WPF、WCF Data Services 进行很好的集成
EF 的优缺点
EF 的优点
1. 极大地提高开发效率,开发代码都是强类型的,写代码效率非常高,自动化程序高,采用命令式的编程
2.EF 提供的模型设计器非常强大,不仅仅带来了设计数据库的革命,其附带来的自动化生成模型代码的功能也极大地提高了开发和架构的效率
3.EF 跨数据库支持是 ORM 框架的主要功能点之一,有着仅仅通过改变配置就可以做到跨数据库的能力、能换数据库非常方便
EF 的缺点
1.EF 性能不好,性能有损耗。(生成 SQL 脚本阶段)在复杂查询的时候生成的 SQL 脚本效率不是很高
2. 数据库端性能损耗是一样的,但是在将对象状态转换为 SQL 语句时会损失性能
今天的关于使用Entity Framework Fluent语法或内联语法编写递归CTE和fluent scheme语言的分享已经结束,谢谢您的关注,如果想了解更多关于c# – Entity-framework-7将Fluent API配置组织到一个单独的类中、c# – 使用Entity Framework T4 POCO、c# – 如何使用Entity Framework Code First Fluent API仅在连接表上级联删除、Entity FrameWork (实体框架) 是以 ADO.NET Entity FrameWork , 简称为 EF的相关知识,请在本站进行查询。
本文标签: