Внешний ключ, указывающий на составной ключ

#c# #entity-framework-4.1

#c# #entity-framework-4.1

Вопрос:

Я работаю над моделью сущностей POCO в существующей базе данных. Одна таблица имеет составной ключ

 public class Table1
{
  [Key]
  public virtual int Key1 {get; set;}

  [Key]
  public virtual int Key2 {get; set;}

  public virtual ICollection<Table2> Tables2 {get; set;}

  //more properties here...
}  

и вторая таблица без первичного ключа, но с 2 свойствами, ссылающимися на составной ключ Table1.

 public class Table2
{
  public virtual int Key1 {get; set;}

  public virtual int Key2 {get; set;}

  [InverseProperty("Tables2")]
  public virtual Table1 Table1 {get; set;}

  //more properties here...
}  

ВОПРОС Возможно ли сопоставить эту ассоциацию с использованием DataAnnotations?
Если да, то как?

Комментарии:

1. является ли для EF объектом с таким количеством атрибутов POCO ?

Ответ №1:

Да, вы можете определить составной внешний ключ с аннотациями данных:

 public class Table2
{
    [ForeignKey("Table1"), Column(Order = 1)]
    public virtual int Key1 {get; set;}

    [ForeignKey("Table1"), Column(Order = 2)]
    public virtual int Key2 {get; set;}

    [InverseProperty("Tables2")]
    public virtual Table1 Table1 {get; set;}

   //more properties here...
}
  

Или альтернативно:

 public class Table2
{
    public virtual int Key1 {get; set;}

    public virtual int Key2 {get; set;}

    [InverseProperty("Tables2")]
    [ForeignKey("Key1, Key2")]
    public virtual Table1 Table1 {get; set;}

   //more properties here...
}
  

Но реальная проблема в том, что Table2 у вас нет первичного ключа, который требуется Entity Framework. Я не думаю, что есть какой-либо обходной путь для решения этой проблемы, кроме добавления первичного ключа в таблицу.

Комментарии:

1. Спасибо! это то, что я искал. Я работаю с администраторами баз данных, чтобы получить для этой таблицы PK.