2011-01-26 2 views
3

У меня есть проект, который имеет довольно много структур данных, и я хочу представить в него базу данных. Я изучаю функцию 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, потому что любое из следующих действий запускает программу:

  1. Удалить [Key]; или
  2. Переместите [Ключ] в IntValue.

Как я могу получить EF для отображения моих классов идентификаторов как ПК? Два варианта, которые приходят на ум:

  1. Выясните способ получения EF для использования не примитивного типа как ПК.
  2. Поместите «int» в качестве PK и получите EF для преобразования этого «int» в MyIdentifier (это имеет тот недостаток, что, если я когда-либо решаю использовать что-то, отличное от «int», мне придется обновить MyIdentifier и отображение, но это, по крайней мере, позволит мне сохранить безопасность типа идентификатора). Я думал, что функция Imports позволит мне сделать это, но кажется, что они построены поверх хранимых процедур.

Есть ли способ достичь этого?

+0

мне удалось добиться этого в FluentNHibernate с помощью CompositeId (х => x.MyId) .KeyProperty (х => x.UniqueId). Есть ли эквивалент CompositeId в EF CTP5? Я не мог найти его. –

ответ

0

Я бы преобразовал ключ с свойством в пользовательский тип.

public class MyObject 
{ 
    public int Id { get; set; } 

    public int IntValue { get; set; } 

    public MyIdentifierType MyId 
    { 
     get { return new MyIdentifierType {UniqueId = Id}; } 
     set { Id = value.UniqueId; } 
    } 
} 
Смежные вопросы