2013-11-19 5 views
1

Я следующий объект данных:Code First - Entity Framework - Как выставить внешние ключи

public class Customer : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Customer> 
{ 
    public Customer() 
    { 
     // this.HasRequired(a => a.EyeColorType).WithMany().HasForeignKey(a => a.EyeColorTypeID); 
    } 

    [Key] 
    public int ID { get; set; } 

    [Required] 
    [MaxLength(100)] 
    public string FirstName { get; set; } 

    [Required] 
    [MaxLength(100)] 
    public string LastName { get; set; } 

    [Required] 
    [ForeignKey("EyeColorTypeID")] 
    public EyeColorType EyeColorType { get; set; } 
    // public int EyeColorTypeID { get; set; } 

} 

}

То, что я пытаюсь сделать, это выставить поле EyeColorTypeID на сгенерированной собственности клиента , а также указать имя в БД.

Если я удалю оба комментария, он работает, но я хотел бы использовать аннотацию данных для этого. Что-то вроде [ExposeForeignKey("EyeColorTypeID")] и все это произойдет автоматически.

Возможно ли это? Как я могу это сделать?

+0

Вам нужно добавить 'public Int32 EyeColorTypeID' (или любой другой тип данных, который ваш ключ). –

+0

Спасибо, я хотел включить это. Я добавил его к вопросу выше. В принципе, мне все еще нужно, чтобы прокомментированная строка вверху отображалась на самом деле, поэтому я могу сказать myContext.Customers.First(). EyeColorTypeID = 1; В противном случае это даст мне только myContext.Customers.First(). EyeColorType = someEyeColorTypeInstance; Обязательная часть в порядке, я просто хочу, чтобы поле внешнего идентификатора было открыто. – James

+0

Возможно, вы можете использовать PostSharp для этого. –

ответ

2

Просто добавьте его в модель и сделать навигацию свойство виртуального (для отложенной загрузки):

public class Customer : //etc 
{ 

    //your stuff 

    [Required] 
    public int EyeColorTypeID {get; set;} 

    public virtual EyeColorType EyeColorType { get; set; } 
} 

Соглашение по именованию Е.Ф. свяжут EyeColorTypeID к EyeColorType свойства навигации.

+0

Извините, я пропустил это из оригинального вопроса. Я добавил его сейчас. Да, я могу это сделать, но мне нужна верхняя часть (прокомментировал это), чтобы разоблачить ее на объекте. Как я могу достичь этого, используя ТОЛЬКО аннотации данных? – James

+0

Какую версию EF вы используете? Мне никогда не приходилось использовать вызов '.HasForeignKey'. С другой стороны, мне никогда не нужно было использовать ': EntityTypeConfiguration'. Для меня достаточно 'public int FooId' и' public VIRTUAL FooClass Foo'. – Stefan

+0

версии 6. Да, я могу просто создать класс без интерфейса и просто поместить идентификатор свойства, как вы предлагали, но тогда он не отображается как свойство в моем классе. Он ослепляет его и дает ему правильное имя в БД, но я могу только прорисовываться до экземпляра, а не ID int – James

Смежные вопросы