4

Я определил DataObject как:Entity Framework 6 создает столбец Id, даже если другой первичный ключ определен

public class SensorType : EntityData 
{ 
    //PKs 
    public string CompanyId { get; set; } 
    public string ServiceId { get; set; } 

    public string Type { get; set; } 
} 

И использовали свободно API, чтобы сделать CompanyID и ServiceID составной ключ:

modelBuilder.Entity<SensorType>() 
      .HasKey(t => new { t.CompanyId, t.ServiceId }); 

//No autogeneration of PKs 
modelBuilder.Entity<SensorType>().Property(t => t.ServiceId) 
      .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); 
modelBuilder.Entity<SensorType>().Property(t => t.CompanyId) 
      .HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None); 

Даже хотя был установлен первичный ключ. Entity Framework создает столбец с именем Id при запуске Add-Migration:

CreateTable(
      "dbo.SensorTypes", 
      c => new 
       { 
        CompanyId = c.String(nullable: false, maxLength: 128), 
        ServiceId = c.String(nullable: false, maxLength: 128), 
        Type = c.String(), 
        Id = c.String(
         annotations: new Dictionary<string, AnnotationValues> 
         { 
          { 
           "ServiceTableColumn", 
           new AnnotationValues(oldValue: null, newValue: "Id") 

        ... 
       }) 
      .PrimaryKey(t => new { t.CompanyId, t.ServiceId }) 
      .Index(t => t.CreatedAt, clustered: true); 

    } 

Как предотвратить добавление этого столбца в EF?

+1

Преднамеренно пытаются использовать комбинацию обоих полей в качестве составного ключа? Если да, есть ли у вас действительно веская причина? – Basic

+0

вам не нужно указывать структуру сущности о DatabaseGeneratedOption.Нет, просто установите отношения с таблицами Company и Service – Monah

+1

Поместите код EntityData, кажется, что данные Entity содержат идентификатор, и это является причиной его первичного ключа – Monah

ответ

2

Я подозреваю, что это что-то делать с факт, что вы получаете свой класс от EntityData и EntityData, имеет свойство Id. Я предполагаю, что EF запутывается, потому что есть свойство, которое придерживается его основных соглашений об именах (т. Е. Id) и явно определенного ключа.

Я подозреваю, что вам придется сказать, что он явно игнорирует Id.

MSDN: EntityData Class

UPDATE:

Я предполагаю, что вы работаете с Azure для этого. У этого SO question есть дополнительная информация в ответах, которые могут помочь вам найти оптимальное решение.

Однако, я согласен с @Basic в своем комментарии к вашему вопросу. Я вообще уклоняюсь от составных клавиш с EF из-за сложности (и других проблем), которые они представляют. Я подозреваю, что уникальное ограничение на ваши поля CompanyId и ServiceId достигнет того, чего вы хотите, без привлечения их в первичном ключе для SensorType. Это также означает, что вы можете просто использовать производное свойство Id в качестве основного ключа и избегать всей проблемы. Я не знаю, насколько это возможно для вашей реализации, но это то, что нужно учитывать.

+0

Теперь дело ясно, Идентификатор в EntityData генерируется также как Id, он может сказать беглому api игнорировать его или просто не позволить SensorType получить унаследованное от EntityData – Monah

+0

Игнорирование идентификатора! НО это нарушение принципа замещения Либковского. Возможно ли использовать EF и сгенерировать контроллер без наследования от EntityData? Он обеспечивает: CreatedAt, updatedAt, ect. и, конечно, Id. –

+0

@Emil См. Обновление некоторых идей по этому вопросу. –

-1

См текст в документации:

Entity Framework зависит от каждого лица, имеющего ключевое значение, которое он использует для отслеживания объектов. Одно из условий, из-за которых первый код зависит от того, как он подразумевает, какое свойство является ключом в каждом из первых классов кода. Это соглашение должно искать свойство с именем «Id» или одно, которое объединяет имя класса и «Id», например «BlogId». Свойство будет отображаться в столбце первичного ключа в базе данных.

использовать другой ключ, вам нужно использовать аннотации [ключ], например:

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

Documentation Oficial

Tutorial Link