我正在尝试使用实体框架创建一个基本示例,以将 SQL Server 存储过程的输出映射到 C# 中的实体,但该实体具有不同(友好)的名称参数,而不是更神秘的名称。我还尝试使用 Fluent(即非 edmx)语法来做到这一点。
什么有效....
存储过程返回名为:UT_ID、UT_LONG_NM、UT_STR_AD、UT_CITY_AD、UT_ST_AD、UT_ZIP_CD_AD、UT_CT 的值
如果我创建一个像这样的对象......
public class DBUnitEntity
{
public Int16 UT_ID { get; set; }
public string UT_LONG_NM { get; set; }
public string UT_STR_AD { get; set; }
public string UT_CITY_AD { get; set; }
public string UT_ST_AD { get; set; }
public Int32 UT_ZIP_CD_AD { get; set; }
public string UT_CT { get; set; }
}
和这样的 EntityTypeConfiguration ...
public class DbUnitMapping: EntityTypeConfiguration<DBUnitEntity>
{
public DbUnitMapping()
{
HasKey(t => t.UT_ID);
}
}
...我将其添加到 DbContext 的 OnModelCreating 中,然后我可以从数据库中很好地获取实体,这很好,使用这个 ....
var allUnits = _context.Database.SqlQuery<DBUnitEntity>(StoredProcedureHelper.GetAllUnitsProc);
但是,什么不起作用
如果我想要一个像这样的实体,具有更友好的名称......
public class UnitEntity : IUnit
{
public Int16 UnitId { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public Int32 Zip { get; set; }
public string Category { get; set; }
}
和这样的 EntityTypeConfiguration ...
public UnitMapping()
{
HasKey(t => t.UnitId);
Property(t => t.UnitId).HasColumnName("UT_ID");
Property(t => t.Name).HasColumnName("UT_LONG_NM");
Property(t => t.Address).HasColumnName("UT_STR_AD");
Property(t => t.City).HasColumnName("UT_CITY_AD");
Property(t => t.State).HasColumnName("UT_ST_AD");
Property(t => t.Zip).HasColumnName("UT_ZIP_CD_AD");
Property(t => t.Category).HasColumnName("UT_CT");
}
当我尝试获取数据时,我收到 System.Data.EntityCommandExecutionException 消息...
“数据读取器与指定的‘DataAccess.EFCodeFirstSample.UnitEntity’不兼容。类型的成员‘UnitId’在数据读取器中没有同名的对应列。”
如果我将“存储过程命名”属性添加到实体,它会抱怨下一个“未知”属性。
在这种代码优先的存储过程流畅风格的 EF 中,“HasColumnName”是否无法按照我的预期/希望的方式工作?
Update:
尝试使用 DataAnnotations(来自 ComponentModel 的键和来自 EntityFramework 的列)...ala
public class UnitEntity : IUnit
{
[Key]
[Column("UT_ID")]
public Int16 UnitId { get; set; }
public string Name { get; set; }
这确实消除了对具有数据库相同命名的 DBUnitEntity 的任何 EntityTypeConfiguration 的需要(即仅添加 [Key] 属性),但对于属性名称与数据库不匹配的实体没有任何作用(相同的错误)像之前一样)。
我不介意在模型中使用 ComponentModel 注释,但如果可以的话,我真的不想在模型中使用 EntityFramework 注释(不想将模型绑定到任何特定的数据访问框架)