【问题标题】:EF6 Map and MapToStoredProcedures equivalent in EF CoreEF Core 中等效的 EF6 Map 和 MapToStoredProcedures
【发布时间】:2020-11-23 21:37:21
【问题描述】:

我正在将我们的 webapis 重写为 .NET Core 并使用 EntityFrameworkCore 5.0。在我们之前的迭代中,我们使用了 EntityFramework 6。我们正在移动这个应用程序,以便我们可以在 azure 上托管它。

我是 EFCore 的新手,注意到一些我似乎无法解决的差异。

我们有一个实体,它将使用来自两个表的映射,一个是视图,另一个是对象将存在的实际表。最后一部分包含用于插入、更新和删除条目中的存储过程dbo.PhoneFaxEmail 表。

之前的 EF6 代码如下。

Map(m =>
            {
                m.ToTable("HomeownerContactDetails_vw", "monarch");
                m.Properties(h => new { h.HomeownerId, h.Id, h.StartDate, h.EndDate });

                m.Requires("RelationTypeLUKey").HasValue(587); // Contact-PhoneFaxEmail (p-c)

                m.Property(h => h.HomeownerId).HasColumnName("ParentRelationKey");
                m.Property(h => h.Id).HasColumnName("ChildRelationKey");
            });

            #endregion

            #region PhoneFaxEmail Mapping

            Map(m =>
            {
                m.ToTable("dbo.PhoneFaxEMail");
                m.Properties(h => new { h.Type, h.Value, h.ValidDate, h.Status, h.Version });

                m.Property(h => h.Id)
                    .HasColumnName("RelationKey");

                m.Property(h => h.Type).HasColumnName("PhoneFaxEMailTypeLUKey");
                m.Property(h => h.Value).HasColumnName("Value");
                m.Property(h => h.ValidDate).HasColumnName("StatusDate");
                m.Property(h => h.Status).HasColumnName("StatusLUKey");
                m.Property(a => a.CreatedBy).HasColumnName("CreatedBy");
                m.Property(a => a.CreatedDate).HasColumnName("CreatedDate");
                m.Property(a => a.ModifiedBy).HasColumnName("ModifiedBy");
                m.Property(a => a.ModifiedDate).HasColumnName("ModifiedDate");
            });

            #endregion

            MapToStoredProcedures(s =>
            {
                s.Insert(i => i.HasName("HomeownerContactDetailCreate_sp", "monarch"));
                s.Update(u =>
                {
                    u.HasName("HomeownerContactDetailUpdate_sp", "monarch");
                    u.Parameter(p => p.Id, "RelationKey");
                    u.Parameter(p => p.Version, "Version");
                });

                s.Delete(i =>
                {
                    i.HasName("HomeownerContactDetailDelete_sp", "monarch");
                    i.Parameter(p => p.Id, "RelationKey");
                    i.Parameter(p => p.Version, "Version");
                });
            }); 

我在 .NET Core 中遇到的问题是没有 Map() 函数,也没有 MapToStoredProcedures() 函数。我不确定从这里去哪里将实体映射到两个单独的表,以及 EF Core 如何映射 procs(或者它甚至以相同的方式映射 procs)。

我尝试使用此代码进行实体拆分,但“m”lamba 表达式会生成一个 TableBuilder 对象,该对象只有 2 个方法,m.ExcludeFromMitigations() 和 m.GetType()。

pfeEntity.ToTable("dbo.PhoneFaxEmail");
            pfeEntity.Property(b => b.Id).HasColumnName("RelationKey");
            pfeEntity.Property(b => b.Value).HasColumnName("Value");

            pfeEntity.ToTable("HomeownerContactDetails_vw", "monarch", m =>
            {

                m.Property(b => b.BlogId).HasColumnName("Id");
                m.Property(b => b.Url);
            });

任何帮助将不胜感激! (即使我完全以错误的方式处理这个问题,就像我说的,全新的并且想尽我所能学习 EFCore!)

【问题讨论】:

  • 不幸的是,支持实体拆分或映射到存储过程。
  • @IvanStoev Dang!那太糟糕了,但很高兴我问了。如果您将其作为官方答案,我会标记它。

标签: c# entity-framework-core


【解决方案1】:

您可以使用存储过程的属性声明一个 DbSet 并调用

context.DbSetName.FromSqlRaw("Execute yourStoredProcedure")

它将被映射到声明的 DbSet 模型。

查看此问题中的示例: Generating and accessing stored procedures using Entity framework core

【讨论】:

    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2021-04-12
    • 1970-01-01
    • 2021-04-27
    相关资源
    最近更新 更多