以代码优先方法映射 SQL 视图

Posted

技术标签:

【中文标题】以代码优先方法映射 SQL 视图【英文标题】:Mapping SQL view in code-first approach 【发布时间】:2013-06-03 05:30:10 【问题描述】:

我有一个 SQL 视图:

WITH DirectReports (ID,ParentFolderID, ParentFolderName,FolderID,FolderName,OwnerOCID,OwnerArName,OwnerEnName,FolderType,LEVEL)
                            AS
                            (
SELECT        e.Id AS ID,cast(cast(0 AS binary) AS uniqueidentifier) AS ParentFolderID, cast('MainFolder - ' + MainFolders.enName AS nvarchar(250)) AS ParentFolderName, 
                         e.Id AS FolderID, e.Name AS FolderName, WorkSpaces.Owner_Id AS OwnerOCID, OrgCharts.arName AS OwnerArName, OrgCharts.enName AS OwnerEnName, 
                         MainFolders.Type AS FolderType, 0 AS LEVEL
FROM            WorkSpaceFolders AS e INNER JOIN
                         MainFolders ON MainFolders.RootFolder_Id = e.Id INNER JOIN
                         WorkSpaces ON WorkSpaces.Id = MainFolders.WorkSpace_Id INNER JOIN
                         OrgCharts ON OrgCharts.Id = WorkSpaces.Owner_Id
WHERE        e.Root = 1 AND e.Parent_Id IS NULL
UNION ALL
SELECT        e.Id AS ID,e.Parent_Id AS ParentFolderID, d .FolderName AS ParentFolderName, e.Id AS FolderID, e.Name AS ChildFolderName, d .OwnerOCID, d .OwnerArName, 
                         d .OwnerEnName, d .FolderType, LEVEL + 1
FROM            WorkSpaceFolders AS e INNER JOIN
                         DirectReports AS d ON e.Parent_Id = d .FolderID)
    SELECT        *
     FROM            DirectReports

我正在使用代码优先迁移到我的数据库 - 如何将视图映射到以下实体?

public class UserFolders

    public Guid ID  get; set; 
    public Guid ParentFolderID  get; set; 
    public string ParentFolderName  get; set; 
    public Guid FolderID  get; set; 
    public string FolderName  get; set; 
    public Guid OwnerOCID  get; set; 
    public string OwnerArName  get; set; 
    public string OwnerEnName  get; set; 
    public int FolderType  get; set; 
    public int LEVEL  get; set; 

【问题讨论】:

我认为只有使用数据库优先的方法才能做到这一点 【参考方案1】:

视图可以映射为表格。它应该是这样的:

public class UserFoldersMap : EntityTypeConfiguration<UserFolders>

    public UserFoldersMap()
    
        this.ToTable("view_name");

        this.HasKey(t => t.Id);                        
    

希望能帮到你……

【讨论】:

我尝试过类似的方法。它似乎对我不起作用。我们正在使用映射视图,但它们似乎没有为视图正确生成。 我需要 Add-Migration 进行此新更改,并从 Up() 函数中删除 CreateTable() 方法。 -- 找了好久才发现... 无钥匙视图怎么样?我搜索的一些功能在我使用的这个 EF 中不存在..【参考方案2】:

我发现如果我的映射与我的视图不完全匹配,那么在尝试生成“表”时会出错,因为它认为它已经存在或与我的代码中的定义不匹配。

我在EF Power Tools 中使用了逆向工程师代码优先功能,并复制了它为我的视图生成的模型和模型映射文件。这些工作没有问题。

然后,最后一步,我在 DbContext 中的 OnModelCreation 方法中添加了 Map 文件:

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    modelBuilder.Configurations.Add(new UserFoldersMap());

【讨论】:

我第一次听说 EF Power Tools ,试了一下,但它有一个错误,说我的上下文不包含有效字符。 两个问题:1)当你用这种方式映射一个实体时,你如何访问它? 2)您需要在 Context 类中创建它吗?如: public DbSet UserFolders get;私人套装; (假设只有公共获取,因为它是数据的只读视图?)

以上是关于以代码优先方法映射 SQL 视图的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先 - 为 SqlQuery 配置映射

JPA 是不是支持映射到 sql 视图?

更新映射到视图的实体框架实体

首先将视图映射到 MVC 代码

SQL:如何找到视图列到表列的映射?

VS 2010 SQL Server Compact 现在在数据库表编辑视图中添加