Yur*_* N. 43 c# entity-framework entity-framework-core
例如,我有这样的模型:
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public BlogImage BlogImage { get; set; }
}
public class BlogImage
{
public int BlogImageId { get; set; }
public byte[] Image { get; set; }
public string Caption { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想在ImageView视图中返回Url和Image.
我在哪里需要创建和定义SQL视图?
Ana*_*nis 50
在Entity Framework Core 2.1中,我们可以使用Yuriy N建议的查询类型.
有关如何使用它们的更详细的文章可以在这里找到
根据文章的例子,最直接的方法是:
1.我们有以下实体模型来管理出版物
public class Magazine
{
public int MagazineId { get; set; }
public string Name { get; set; }
public string Publisher { get; set; }
public List<Article> Articles { get; set; }
}
public class Article
{
public int ArticleId { get; set; }
public string Title { get; set; }
public int MagazineId { get; set; }
public DateTime PublishDate { get; set; }
public Author Author { get; set; }
public int AuthorId { get; set; }
}
public class Author
{
public int AuthorId { get; set; }
public string Name { get; set; }
public List<Article> Articles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
2.我们有一个名为AuthorArticleCounts的视图,定义为返回作者编写的文章的名称和数量
SELECT
a.AuthorName,
Count(r.ArticleId) as ArticleCount
from Authors a
JOIN Articles r on r.AuthorId = a.AuthorId
GROUP BY a.AuthorName
Run Code Online (Sandbox Code Playgroud)
3.我们去创建一个用于View的模型
public class AuthorArticleCount
{
public string AuthorName { get; private set; }
public int ArticleCount { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
4.我们在DbContext中创建一个DbQuery属性来使用Model中的视图结果
public DbQuery<AuthorArticleCount> AuthorArticleCounts{get;set;}
Run Code Online (Sandbox Code Playgroud)
5.最后,我们可以轻松地获得View的结果.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Query<AuthorArticleCount>().ToView("AuthorArticleCount");
}
Run Code Online (Sandbox Code Playgroud)
nat*_*ter 25
Entity Framework Core目前不支持视图.请参阅https://github.com/aspnet/EntityFramework/issues/827.
也就是说,您可以通过将实体映射到视图来欺骗EF使用视图,就好像它是一个表一样.这种方法有局限性.例如,您无法使用迁移,您需要为我们手动指定EF的密钥,并且某些查询可能无法正常运行.要绕过最后一部分,您可以手动编写SQL查询
context.Images.FromSql("SELECT * FROM dbo.ImageView")
Run Code Online (Sandbox Code Playgroud)
小智 14
EF Core不会在上下文calss中自动为SQL视图创建DBset,我们可以手动添加它们,如下所示.
public partial class LocalDBContext : DbContext
{
public LocalDBContext(DbContextOptions<LocalDBContext> options) : base(options)
{
}
public virtual DbSet<YourView> YourView { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<YourView>(entity => {
entity.HasKey(e => e.ID);
entity.ToTable("YourView");
entity.Property(e => e.Name).HasMaxLength(50);
});
}
}
Run Code Online (Sandbox Code Playgroud)
示例视图定义如下,几个属性
using System;
using System.Collections.Generic;
namespace Project.Entities
{
public partial class YourView
{
public string Name { get; set; }
public int ID { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
在上下文类中为视图和数据库集添加类后,最好通过控制器中的上下文对象使用视图对象.
nzr*_*tmn 10
EF Core 支持视图,这里是详细信息。
此功能是在 EF Core 2.1 中以查询类型的名称添加的。在 EF Core 3.0 中,该概念被重命名为无键实体类型。[Keyless] 数据注释在 EFCore 5.0 中可用。
它的工作方式与普通实体没有太大不同;但有一些特别之处。根据文档:
- 不能定义键。
- 永远不会跟踪 DbContext 中的更改,因此永远不会在数据库中插入、更新或删除。
- 永远不会被惯例发现。
- 仅支持一部分导航映射功能,特别是:
- 他们可能永远不会成为关系的主要终点。
- 他们可能没有到拥有实体的导航
- 它们只能包含指向常规实体的参考导航属性。
- 实体不能包含无键实体类型的导航属性。
- 需要配置[Keyless]数据注解或.HasNoKey()方法调用。
- 可以映射到定义查询。定义查询是在模型中声明的查询,它充当无键实体类型的数据源
它的工作原理如下:
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public ICollection<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果您在数据库中没有现有视图,您应该像下面这样创建:
db.Database.ExecuteSqlRaw(
@"CREATE VIEW View_BlogPostCounts AS
SELECT b.Name, Count(p.PostId) as PostCount
FROM Blogs b
JOIN Posts p on p.BlogId = b.BlogId
GROUP BY b.Name");
Run Code Online (Sandbox Code Playgroud)
而且你应该有一个类来保存数据库视图的结果:
public class BlogPostsCount
{
public string BlogName { get; set; }
public int PostCount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后使用 HasNoKey 在 OnModelCreating 中配置无键实体类型:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<BlogPostsCount>(eb =>
{
eb.HasNoKey();
eb.ToView("View_BlogPostCounts");
eb.Property(v => v.BlogName).HasColumnName("Name");
});
}
Run Code Online (Sandbox Code Playgroud)
只需配置 DbContext 以包含 DbSet:
public DbSet<BlogPostsCount> BlogPostCounts { get; set; }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
59190 次 |
最近记录: |