ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

c# – EF4.1 – Fluent API – SqlQuery – 调用sproc时的配置映射 – 数据读取器与指定的实体类型不兼容

2019-05-30 23:53:48  阅读:392  来源: 互联网

标签:c stored-procedures entity-framework entity-framework-4-1 fluent-interface


场景 – 具有10年历史的遗留应用程序,一直使用过程调用来进行所有数据访问 – 需要从混合的经典ASP和.NET页面集中进行彻底检查.

目标 – 使用带有Fluent API的EF 4.1迁移到.NET 4.0,并尽可能继续使用现有的数据库sprocs.

主要课程:

public class EntityBase
{
    public int Id { get; set; }
}

public class User : EntityBase
{
    public string UserName { get; set; }
...
}

配置:

internal class ConfigurationBase<T> : EntityTypeConfiguration<T> where T : EntityBase
{
    protected ConfigurationBase()
    {
        HasKey(t => t.Id);
    }
}

internal class UserConfiguration : ConfigurationBase<User>
{
    internal UserConfiguration()
    {
        Property(p => p.Id)
            .HasColumnName("Person_Id")
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
            .IsRequired();
        Property(p => p.UserName)
            .HasMaxLength(64);
        ToTable("Person");
    }
}

上下文全部在DbContext.OnModelCreating中设置为:

    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new UserConfiguration());
    }

当我通过上下文直接访问数据时,一切都很好,例如:

    public override IQueryable<User> GetAll()
    {
        return UnitOfWork.Context.Users;
    }

但是当我尝试使用包含以下内容的现有sproc时:

SELECT  p.Person_Id,
        p.IsUser,
        p.FirstName,
        p.LastName,
        p.UserName,
        p.Email,
        p.CreatedBy,
        p.CreatedDate,
        p.IsActive,
        p.ModifiedBy,
        p.ModifiedDate
FROM    Person p 
WHERE   p.UserName = @UserName
AND     p.IsActive = 1

我执行以下操作:

    public User AuthorizeUser(string userName)
    {
        SqlParameter p = new SqlParameter { 
            DbType = DbType.String,
            ParameterName = "UserName",
            Size = 64,
            Value = userName
        };
        object[] parameters = new object[] {p};

        return UnitOfWork.Context.Users.SqlQuery(CPODSStoredProcedures.User_AuthorizeUser, parameters).FirstOrDefault();
    }

我得到:
数据阅读器与指定的“用户”不兼容.类型为“Id”的成员在数据读取器中没有相应的具有相同名称的列.

我已经跟踪了执行并且正在读取配置,所以我做错了什么,或者是SqlQuery的sproc执行没注意在这种情况下如何将基本Id重新映射到Person_Id.

提前致谢!
G

解决方法:

EF 4.1 Code First(即:您尝试使用的流畅API)不支持存储过程. See here.

如果你想用EF做这件事,你别无选择,只能创建一个模型(或者等到下一个版本).我个人认为这不是一个问题,因为数据库已经存在,使用DB创建一个模型First非常简单(在那些表中指出并说“构建这个”).然后,您可以切换EF以使用DbContext生成器并获得漂亮的干净POCO类来处理您的数据. Here’s a simple explanation on how to do that.

我知道流利的API现在是符合流行语的闪亮之物,但它在这个版本的EF中也是全新的,并不是一切都在那里.使用遗留应用程序,它可以为您节省大量的麻烦,只需使用DB First模型和POCO类生成器.

标签:c,stored-procedures,entity-framework,entity-framework-4-1,fluent-interface
来源: https://codeday.me/bug/20190530/1187070.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有