如何避免实体框架中的硬编码字段名称?

时间:2009-03-25 23:38:31

标签: c# .net entity-framework

如何避免在实体框架中使用硬编码的表和字段名称?例如:

  Contact contact =
        contactQuery.Include("SalesOrderHeader.SalesOrderDetail")
        .FirstOrDefault();

有没有办法从上下文或元数据中获取该信息?我很乐意能说SalesOrderHeader.TableName或SalesOrderHeaderFields.SalesOrderDetails.FieldName

4 个答案:

答案 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)));

我希望有一种充满活力的反思方式...... 再一次,我心胸开阔,任何建议都会得到祝福 谢谢