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

场景 – 具有10年历史的遗留应用程序,一直使用过程调用来进行所有数据访问 – 需要从混合的经典ASP和.NET页面集中进行彻底检查.目标 – 使用带有Fluent API的EF 4.1迁移到.NET 4.0,并尽可能继续使用现有的数据库spr...

场景 – 具有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# – EF4.1 – Fluent API – SqlQuery – 调用sproc时的配置映射 – 数据读取器与指定的实体类型不兼容

基础教程推荐