山东建设机械协会网站,wordpress 主动提交,前端开发培训机构排名前十,编程开源网站【Entity Framework】你知道如何处理无键实体吗 文章目录 【Entity Framework】你知道如何处理无键实体吗一、概述二、定义无键实体类型数据注释 三、无键实体类型特征四、无键实体使用场景五、无键实体使用场景六、无键使用示例6.1 定义一个简单的Blog和Post模型#xff1a;6…【Entity Framework】你知道如何处理无键实体吗 文章目录 【Entity Framework】你知道如何处理无键实体吗一、概述二、定义无键实体类型数据注释 三、无键实体类型特征四、无键实体使用场景五、无键实体使用场景六、无键使用示例6.1 定义一个简单的Blog和Post模型6.2 定义一个简单数据库视图6.3 定义一个类来保存数据库视图的结果6.4 使用HasNoKey API在OnModelCreating中配置无键实体类型6.5 配置DbContext以包含DbSetT6.7 采用标准方式查询数据库视图 七、总结 一、概述
Entity Framework 除了常规实体类型外EF Core模型还可以包含无键实体类型可用于对不包含键值的数据执行数据库查询。
二、定义无键实体类型
可按如下定义无键实体类型 数据注释
[Keyless]
public class BlogPostsCount
{public string BlogName{get;set;}public int PostCount{get;set;}
}Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.EntityBlogPostsCount().HasNoKey();
}三、无键实体类型特征
无键实体类型支持与常规实体类型相同的多个映射功能例如继承映射和导航属性。在关系存储上它们可以通过Fluent API方法或数据注释来配置目标数据库对象和列。
但是它们不同于常规实体类型因为他们 不能定义键 永远不会对DbContext中的更改进行跟踪因此不会对数据库进行插入更新或删除这些操作 绝不会被约定发现 仅支持导航映射功能的子集具体如下 它们永远不能充当关系的主体端它们可能没有指向从属实体的导航它们只能包含指向常规实体的引用导航属性实体不能包含无键实体类型的导航属性 需要配置 [Keyless] 数据注释或 .HasNoKey() 方法调用 可以映射到定义查询。 定义查询是在模型中声明的查询它充当无键实体类型的数据源 可以具有层次结构但必须映射为 TPH 不能使用表拆分或实体拆分
四、无键实体使用场景
无键实体类型的一些主要使用场景包括
充当SQL查询的返回类型映射到不包含主键的数据库视图映射到未定义主键的表映射到模型中定义的查询
五、无键实体使用场景
可以使用 ToTable 或 ToView Fluent API 将无键实体类型映射到数据库对象。 从 EF Core 的角度来看此方法中指定的数据库对象是一个视图这意味着它将被视为只读查询源并且不能作为更新、插入或删除操作的目标。 但是这并不意味着数据库对象实际上必须是数据库视图。 它也可以是将被视为只读的数据库表。 相反对于常规实体类型EF Core 假设 ToTable 方法中指定的数据库对象可以作为表这意味着它可用作查询源但也可作为更新、删除和插入操作的目标。 事实上可以在 ToTable 中指定数据库视图的名称只要该视图配置为可在数据库上更新一切都应能正常运行。
六、无键使用示例
6.1 定义一个简单的Blog和Post模型
public class Blog
{public int BlogId { get; set; }public string Name { get; set; }public string Url { get; set; }public ICollectionPost 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; }
}6.2 定义一个简单数据库视图
db.Database.ExecuteSqlRaw(CREATE VIEW View_BlogPostCounts ASSELECT b.Name, Count(p.PostId) as PostCountFROM Blogs bJOIN Posts p on p.BlogId b.BlogIdGROUP BY b.Name);6.3 定义一个类来保存数据库视图的结果
public class BlogPostsCount
{public string BlogName { get; set; }public int PostCount { get; set; }
}6.4 使用HasNoKey API在OnModelCreating中配置无键实体类型
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.EntityBlogPostsCount(eb {eb.HasNoKey();eb.ToView(View_BlogPostCounts);eb.Property(v v.BlogName).HasColumnName(Name);});
}6.5 配置DbContext以包含DbSetT
public DbSetBlogPostsCount BlogPostCounts { get; set; }6.7 采用标准方式查询数据库视图
var postCounts db.BlogPostCounts.ToList();
foreach (var postCount in postCounts)
{Console.WriteLine(${postCount.BlogName} has {postCount.PostCount} posts.);Console.WriteLine();
}七、总结
无键主要应用在SQL、视图、存储过程的查询在制作报表时应用比较多。