2

Я думаю, что ниже коды очень полезны. Но я пытаюсь создать EntityKEy. i used:Как я могу написать общий первичный ключ на EntityKey?

EntityKey key = new EntityKey(entitySetKEYName, "XTableId", id); 

Но я не хочу использовать это. мой стол PRIMARYID YtableId, ZTableId и т.д ... Как я могу написать это:
EntityKey key = new EntityKey(entitySetKEYName, Find().PrimaryKEY, id); 

 public T GetByPrimaryKey<T>(int id) 
     { 
      string entitySetName = _context.MetadataWorkspace.GetEntityContainer(_context.DefaultContainerName, DataSpace.CSpace).BaseEntitySets. 
       Where(q => q.ElementType.Name == typeof(T).Name).FirstOrDefault().Name; 
      string entitySetKEYName = string.Format("{0}.{1}", _context.DefaultContainerName, entitySetName); 
      EntityKey key = new EntityKey(entitySetKEYName, "XTableId", id); 

      return (T)_context.GetObjectByKey(key); 
     }

КАК АВТОМАТИЧЕСКИ ОБНАРУЖИТЬ PRIMARY KEY ?????????????? ??

ответ

2

Во-первых, PK не обязательно Int32, он может быть ключевым или даже многокомпонентным сложным ключом, поэтому общий метод должен за исключением Object as PK ... Вот мой довольно уродливый вариант, но он выполняет эту работу, хотя это нуждаются в надлежащем тестировании.

static void Main(string[] args) 
    { 
     var entity = GetEntityByKey<Entity>(Guid.Empty); 
    } 
    private static T GetEntityByKey<T>(object key) where T : class 
    { 
     using (var context = new ObjectContext("Name=ModelContainer")) 
     { 
      var set = context.CreateObjectSet<T>().EntitySet; 
      var pk = set.ElementType.KeyMembers[0]; // careful here maybe count can be o or more then 0 
      EntityKey entityKey = new EntityKey(set.EntityContainer.Name+"."+set.Name, pk.Name, key); 
      return (T)context.GetObjectByKey(entityKey); 
     } 
    } 
Смежные вопросы