如何避免在实体框架中使用硬编码的表和字段名称?例如:
Contact contact =
contactQuery.Include("SalesOrderHeader.SalesOrderDetail")
.FirstOrDefault();
有没有办法从上下文或元数据中获取该信息?我很乐意能说SalesOrderHeader.TableName或SalesOrderHeaderFields.SalesOrderDetails.FieldName
答案 0 :(得分:2)
如果您想使用实体框架元数据,则需要查看挂起MetadataWorkspace
的{{1}}。
起点是获取您的基本类型的EntityType,在您的情况下为Contact。
我有一个EF tips series,在Tip 13我在ObjectContext
上显示了一个获取特定CLR类型MetadataWorkspace
的扩展方法:
EntityType
你可以这样使用:
public static EntityType GetCSpaceEntityType<T>(
this MetadataWorkspace workspace);
一旦你有了这个,你可以查看它的NavigationProperties来找到你感兴趣的关系和名称,包括:
即
var contactEntity = ctx.MetadataWorkspace.GetCSpaceEntityType<Contact>();
当然,您如何决定要包含的内容取决于您。 希望这有帮助
亚历
答案 1 :(得分:2)
阅读Say goodbye to the hardcoded ObjectQuery(T).Include calls,你可以像下面那样使用lambda&amp; linq表达树:
Dim c = GetObjectContext()
Dim query = c.Vendors.Include(Function(v) v.Contact.Addresses.Single.State)
还有一个C#samle。
HTH
答案 2 :(得分:1)
这只是一个属性名称,所以你可以通过反思得到它。
答案 3 :(得分:0)
示例(希望听到更好的想法,没有找到像VB GetType那样接受类型名称作为参考的方法):
<强> VB:强>
<Extension()>
Function GetRelation(Of TEntity As Type)(entity As TEntity,
ParamArray path() As TEntity) As String
GetRelation = entity.Name
For Each type In path
GetRelation &= "." & type.Name
Next
End Function
'Here is your line:
Dim x = Context.Employee.Include(
GetType(Contact).GetRelation(GetType(SalesOrderHeader),
GetType(SalesOrderDetail)))
<强> C#:强>
static string GetRelation<TEntity>(this TEntity entity, params TEntity[] path)
where TEntity : Type
{
string ret = entity.Name;
foreach (TEntity type in path) ret += "." + type.Name;
return ret;
}
//Put your line here:
var x = context.Employee.Include(typeof(Contact).GetRelation(
typeof(SalesOrderHeader),
typeof salesOrderDetail)));
我希望有一种充满活力的反思方式...... 再一次,我心胸开阔,任何建议都会得到祝福 谢谢