gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:56:59 25 4
gpt4 key购买 nike

场景 - 具有 10 年历史的遗留应用程序,始终使用过程调用来访问所有数据 - 需要从混合的经典 ASP 和 .NET 页面集进行彻底改造。

目标 - 使用带有 Fluent API 的 EF 4.1 迁移到 .NET 4.0,并尽可能继续使用现有的数据库存储过程。

关键类:

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;
}

但是当我尝试使用包含以下内容的现有存储过程时:

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 执行的存储过程没有注意在这种情况下如何将基本 Id 重新映射到 Person_Id。

提前致谢!G

最佳答案

将不兼容的存储过程(或将存储过程结果集转换为新形式)映射到您的对象模型就像使用表 var 和 sp_executesql 作为调用 DbContext.SqlQuery() 时提供的批处理一样简单。请参阅我的博客以获取实际的工作示例->

http://blogs.msdn.com/b/schlepticons/archive/2012/10/15/yes-you-can-execute-parameterized-sprocs-with-ef-fluent-api-code-only-and-more.aspx

关于c# - EF4.1 - Fluent API - SqlQuery - 调用存储过程时的配置映射 - 数据读取器与指定的实体类型不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6297657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com