2015-09-01 2 views
2

У меня есть следующие классы (сокращенные для краткости);Проблема с миграцией базы данных на платформе Entity 6

public class InsurancePolicy : AuditableEntity<int> 
{ 
    [Column("id"), Key] 
    public override int ID { get; set; } 
    [Column("deviceid"), ForeignKey("Device")] 
    public int DeviceId { get; set; } 
    public virtual Device Device { get; set; } 
} 

public partial class Device : AuditableEntity<int> 
{ 
    [Column("deviceid"), Key] 
    public override int ID { get; set; } 

    [ForeignKey("Policy")] 
    public int PolicyId { get; set; } 
    public virtual InsurancePolicy Policy { get; set; } 

    [ForeignKey("Vehicle")] 
    public int VehicleId { get; set; } 
    public virtual Vehicle Vehicle { get; set; } 
} 

public partial class Vehicle : AuditableEntity<int> 
{ 
    [Column("id"), Key] 
    public override int ID { get; set; } 

    [Column("deviceid"), ForeignKey("Device")] 
    public int DeviceId { get; set; } 
    public virtual Device Device { get; set; } 

    public virtual List<InsurancePolicyVehicle> InsurancePolicyVehicles { get; set; } 
} 

Теперь, когда я пытаюсь запустить мою команду update-database я получаю эту ошибку:

Device_Policy_Target: : Multiplicity is not valid in Role 'Device_Policy_Target' in relationship 'Device_Policy'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.

Device_Vehicle_Target: : Multiplicity is not valid in Role 'Device_Vehicle_Target' in relationship 'Device_Vehicle'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.

Может кто-нибудь, пожалуйста, посоветуйте, что я делаю неправильно здесь?

+0

Я чувствую перекрестное отношение между классами. Класс «InsurancePolicy» относится к классу «Устройство» одновременно, и он обращается назад. Я думаю, что это неприемлемо. Просьба оптимизировать отношение таблицы –

ответ

1

Принимая Device_Policy_Target отношения в качестве примера, вы следующее (зачистка вплоть до соответствующих свойств для этого отношения):

public class InsurancePolicy : AuditableEntity<int> 
{ 
    [Column("id"), Key] 
    public override int ID { get; set; } 
    [Column("deviceid"), ForeignKey("Device")] 
    public int DeviceId { get; set; } 
    public virtual Device Device { get; set; } 
} 

public partial class Device : AuditableEntity<int> 
{ 
    [Column("deviceid"), Key] 
    public override int ID { get; set; } 

    [ForeignKey("Policy")] 
    public int PolicyId { get; set; } 
    public virtual InsurancePolicy Policy { get; set; } 

} 

Что вы определяете здесь является один-к-одному , EF поддерживает только такие отношения, в которых обе таблицы разделяют первичный ключ. В вашей конфигурации ваш дочерний стол - InsurancePolicy имеет свой собственный ПК, а внешний ключ - Device. EF поддерживает только отношения «один ко многим» с этими ограничениями.

Чтобы определить эти отношения, чтобы быть один-к-одному, переключить настройку на что-то вдоль линий:

public class InsurancePolicy : AuditableEntity<int> 
{ 
    [Column("deviceid"), Key, ForeignKey("Device")] 
    public override int ID { get; set; } 
    public virtual Device Device { get; set; } 
} 

public partial class Device : AuditableEntity<int> 
{ 
    [Column("deviceid"), Key] 
    public override int ID { get; set; } 

    public virtual InsurancePolicy Policy { get; set; }  
} 

Это все частично является следствием EF не поддерживает уникальные ограничения. This article имеет более полное объяснение один-к-одному отношений с использованием DataAnnotations

Update:

Чтобы «поддельные» на один-к-одному, используя таблицы/ключи вы получили то рассмотреть что-то вроде этого:

public class InsurancePolicy : AuditableEntity<int> 
{ 
    [Column("id"), Key] 
    public override int ID { get; set; } 
    [Column("deviceid"), ForeignKey("Device")] 
    public int DeviceId { get; set; } 
    public virtual Device Device { get; set; } 
} 

public partial class Device : AuditableEntity<int> 
{ 
    [Column("deviceid"), Key] 
    public override int ID { get; set; } 

    public virtual IEnumerable<InsurancePolicy> PoliciesAsList { get; set; } 

    [NotMapped] 
    public virtual InsurancePolicy Policy { 
     get { 
      return (PoliciesAsList != null) 
       ? PoliciesAsList.FirstOrDefault() 
       : null;     
     } 
    } 

} 

В этом случае я arbitrarly выбранной Device как родитель - это не важно, какой вы выберете.

Вы также должны убедиться, что база данных имеет уникальное ограничение на deviceid на столе InsurancePolicy.

+0

Привет, Jon, Спасибо за ответ. Единственная проблема, которую я имею здесь, заключается в том, что таблицы существуют в базе данных (т. Е. Deviceid - это ПК в устройствах, а id - ПК в InsurancePolicy). Поэтому мне нужно сохранить, например, [Column («id»), Key] public override int ID {get; задавать; }, поскольку PK является id эффективно в db, и dba не позволит его изменить. Любое предложение в этой ситуации? –

+0

Если таблицы уже существуют, то зачем запускать миграцию? –

+0

Привет, Джон, Большое спасибо за то, что нашли время, чтобы посмотреть на это. Мне нужно настроить и внести некоторые изменения в таблицы, но мне сказали, что существующие имена столбцов должны оставаться. Таким образом, в этом случае устройство может жить независимо от политики и наоборот. Они могут и будут связаны в конечном итоге (то есть после их распределения и т. Д.). –

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