Как избежать жестко закодированных имен полей в рамках сущности? - PullRequest
2 голосов
/ 26 марта 2009

Как мне избежать использования жестко закодированных имен таблиц и полей в структуре сущностей? Например:

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

Есть ли способ получить эту информацию из контекста или метаданных? Я хотел бы иметь возможность сказать SalesOrderHeader.TableName или SalesOrderHeaderFields.SalesOrderDetails.FieldName

Ответы [ 4 ]

2 голосов
/ 08 августа 2010

Чтение Попрощайтесь с жестко запрограммированным ObjectQuery (T). Включите вызовы , и вы сможете сделать это следующим образом, используя лямбда-выражения и деревья linq-выражений:

Dim c = GetObjectContext()
Dim query = c.Vendors.Include(Function(v) v.Contact.Addresses.Single.State)

Существует также C # samle.

НТН

2 голосов
/ 28 мая 2009

Если вы хотите использовать метаданные Entity Frameworks, вам нужно просмотреть MetadataWorkspace, который свисает с ObjectContext.

Отправной точкой является получение EntityType для вашего базового типа, в вашем случае Contact.

У меня есть EF серия советов и в Совет 13 Я показываю метод расширения на MetadataWorkspace, который получает EntityType для определенного типа CLR:

public static EntityType GetCSpaceEntityType<T>(
        this MetadataWorkspace workspace);

Вы можете использовать это так:

var contactEntity = ctx.MetadataWorkspace.GetCSpaceEntityType<Contact>();

Получив это, вы можете посмотреть его свойства NavigationProperties и найти интересующие вас отношения, включая:

1021 * т.е. *

foreach(var np in contactEntity.NavigationProperties)
{
    Console.WriteLine("Include: {0}", np.Name);
    Console.WriteLine("... Recursively include ");
    EntityType relatedType = 
       (np.ToEndMember.TypeUsage.EdmType as RefType).ElementType;
    //TODO: go repeat the same process... i.e. look at the relatedTypes 
    // navProps too until you decide to stop.
}

Конечно, как вы решите, что вы хотите включить, зависит от вас. Надеюсь, это поможет

Alex

1 голос
/ 26 марта 2009

Это просто имя свойства, поэтому вы можете получить его с помощью отражения.

0 голосов
/ 27 марта 2009

Пример (хотелось бы услышать лучшие идеи, не нашел способа принять имя типа в качестве ссылки, как это делает 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)));

Хотелось бы, чтобы был динамический способ отражения ... Опять же, я непредубежден, любые предложения будут благословлены спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...