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