Entity Framework 列映射
Entity Framework Column Mapping
我在将对象 属性 映射到数据库函数的列时遇到问题。
数据库函数 return 有一个名为 [On Hand]
的列。因此我的模型 属性 被称为 OnHand
.
这显然没有正确映射并且无法正确检索该列的数据。
我尝试了以下方法来解决这个问题:
编辑模型以使用注释
[Column("On Hand")]
public int OnHand { get; set; }
使用流利 API
modelBuilder.Entity<BinDetail>()
.Property(e => e.OnHand)
.HasColumnName("On Hand");
这些方法都没有协同工作或独立工作。
我可以让它在测试数据库上工作的唯一方法是将函数的 return 列更改为 [OnHand]
,但是,由于其他系统使用此函数,这是不是在实时数据库上使用的选项。
如有任何建议,我们将不胜感激
深入研究我的代码后,我意识到我执行函数的方式是使用:
Database.SqlQuery<BinDetail>("Query for function").ToList();
因此,我意识到对此的一种解决方案是更改查询:
SELECT * FROM.....
至:
SELECT ......, [On Hand] AS OnHand.....
。
这确实有效并且似乎可以正确检索数据,但是,我认为这不是一个很好的做法。
因此,如果有人对此或调用函数有更优雅的解决方案,请告诉我,因为我一直在寻求改进我的代码和我们的标准。
如果您使用的是 Entity Framework Core 1.0 RC 1,则有一个错误(已在 RC2 及以后修复)导致此问题。
解决方法是按 A 到 Z 对字段进行排序,快速示例:
"SELECT " + GetColumnNames<Unit>("R") + " FROM Unit AS R"
辅助方法:
private static Dictionary<Type, PropertyInfo[]> getPropertiesCache = new Dictionary<Type, PropertyInfo[]>();
public static string GetColumnNames<T>(string prefix)
{
var columns = GetProperties(typeof(T)).OrderBy(i => i.Name).Select(i => $"[{prefix}].[{i.Name}]");
return string.Join(", ", columns);
}
public static IEnumerable<PropertyInfo> GetProperties(Type type)
{
if (getPropertiesCache.ContainsKey(type))
return getPropertiesCache[type].AsEnumerable();
var properties = type
.GetTypeInfo()
.DeclaredProperties;
getPropertiesCache.Add(type, properties.ToArray());
return getPropertiesCache[type].AsEnumerable();
}
我在将对象 属性 映射到数据库函数的列时遇到问题。
数据库函数 return 有一个名为 [On Hand]
的列。因此我的模型 属性 被称为 OnHand
.
这显然没有正确映射并且无法正确检索该列的数据。
我尝试了以下方法来解决这个问题:
编辑模型以使用注释
[Column("On Hand")]
public int OnHand { get; set; }
使用流利 API
modelBuilder.Entity<BinDetail>()
.Property(e => e.OnHand)
.HasColumnName("On Hand");
这些方法都没有协同工作或独立工作。
我可以让它在测试数据库上工作的唯一方法是将函数的 return 列更改为 [OnHand]
,但是,由于其他系统使用此函数,这是不是在实时数据库上使用的选项。
如有任何建议,我们将不胜感激
深入研究我的代码后,我意识到我执行函数的方式是使用:
Database.SqlQuery<BinDetail>("Query for function").ToList();
因此,我意识到对此的一种解决方案是更改查询:
SELECT * FROM.....
至:
SELECT ......, [On Hand] AS OnHand.....
。
这确实有效并且似乎可以正确检索数据,但是,我认为这不是一个很好的做法。
因此,如果有人对此或调用函数有更优雅的解决方案,请告诉我,因为我一直在寻求改进我的代码和我们的标准。
如果您使用的是 Entity Framework Core 1.0 RC 1,则有一个错误(已在 RC2 及以后修复)导致此问题。
解决方法是按 A 到 Z 对字段进行排序,快速示例:
"SELECT " + GetColumnNames<Unit>("R") + " FROM Unit AS R"
辅助方法:
private static Dictionary<Type, PropertyInfo[]> getPropertiesCache = new Dictionary<Type, PropertyInfo[]>();
public static string GetColumnNames<T>(string prefix)
{
var columns = GetProperties(typeof(T)).OrderBy(i => i.Name).Select(i => $"[{prefix}].[{i.Name}]");
return string.Join(", ", columns);
}
public static IEnumerable<PropertyInfo> GetProperties(Type type)
{
if (getPropertiesCache.ContainsKey(type))
return getPropertiesCache[type].AsEnumerable();
var properties = type
.GetTypeInfo()
.DeclaredProperties;
getPropertiesCache.Add(type, properties.ToArray());
return getPropertiesCache[type].AsEnumerable();
}