Сценарий - унаследованное приложение с 10-летней историей, всегда использующее вызовы процедур для всего доступа к данным - нуждается в пересмотре из гибридного классического набора страниц ASP и .NET.
Цель - перейти на.NET 4.0, использующий EF 4.1 с Fluent API и продолжающий максимально использовать существующие базы данных.
Ключевые классы:
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» не имеет соответствующего столбца в считывателе данных с тем же именем.
Я проследил выполнение, и конфигурации читаются, поэтому я делаю что-то не так,или выполнение sproc SqlQuery не обращает внимания на то, как в этом случае переназначается базовый Id на Person_Id.
Заранее спасибо!G