У меня есть проект, который имеет довольно много структур данных, и я хочу представить в него базу данных. Я изучаю функцию Entity Framework CTP5 с кодом.Entity Framework CTP5 Code Сначала: используя не примитивный тип как ключ
Теперь я использую отдельный тип идентификатора для каждого из моих типов (например, TypeAIdentifier, TypeBIdentifier и т. Д.). Это хорошо, потому что это позволяет обеспечить безопасность типа при работе с этими идентификаторами. Проблема в том, что я не могу заставить EF использовать не-примитивный тип в качестве идентификатора. Там есть намек на http://blogs.msdn.com/b/efdesign/archive/2010/03/30/data-annotations-in-the-entity-framework-and-code-first.aspx:
KeyAttribute
KeyAttribute is used to specify that a property/column is part of the primary
key of the entity and applies to scalar properties only.
Действительно, следующая программа выдает исключение:
class Program
{
static void Main(string[] args)
{
MyDb db = new MyDb();
db.SaveChanges();
}
}
class MyDb : DbContext
{
public DbSet<MyObject> MyObjects { get; set; }
}
class MyObject
{
[Key] public MyIdentifierType MyId { get; set; }
public int IntValue { get; set; }
}
class MyIdentifierType
{
public int UniqueId { get; set; }
}
Как ни странно эта программа бросает MissingMethodException («не конструктор без параметров, определенные для этого объекта»), но я Убедитесь, что это связано с KeyAttribute, потому что любое из следующих действий запускает программу:
- Удалить [Key]; или
- Переместите [Ключ] в IntValue.
Как я могу получить EF для отображения моих классов идентификаторов как ПК? Два варианта, которые приходят на ум:
- Выясните способ получения EF для использования не примитивного типа как ПК.
- Поместите «int» в качестве PK и получите EF для преобразования этого «int» в MyIdentifier (это имеет тот недостаток, что, если я когда-либо решаю использовать что-то, отличное от «int», мне придется обновить MyIdentifier и отображение, но это, по крайней мере, позволит мне сохранить безопасность типа идентификатора). Я думал, что функция Imports позволит мне сделать это, но кажется, что они построены поверх хранимых процедур.
Есть ли способ достичь этого?
мне удалось добиться этого в FluentNHibernate с помощью CompositeId (х => x.MyId) .KeyProperty (х => x.UniqueId). Есть ли эквивалент CompositeId в EF CTP5? Я не мог найти его. –