У меня есть существующая база данных, которую я использую Entity Framework Code First для сопоставления. Соглашение об именах для столбцов нечетное, поэтому я решил, что я буду сопоставлять свойства сущностей вручную, и до сих пор это было нормально.
Схема для базы данных довольно странная для меня и определенно не такая, как я бы это сделал. К сожалению, я пока застрял с этим.
По сути, существует один первичный ключ (AccountNumber), который используется несколькими таблицами, создавая связку «один к одному». Однако первичный ключ также является столбцом внешнего ключа. Вот как выглядят мои сущности (для простоты удален целый набор свойств). Я включил только две сущности, чтобы упростить это.
public class Customer
{
public int AccountNumber { get; set; }
public String PhoneNumber { get; set; }
...
public virtual Address Address { get; set; }
}
public class Address
{
public int AccountNumber { get; set; }
public String Name { get; set; }
public String Address1 { get; set; }
public String City { get; set; }
...
public virtual Customer Customer { get; set; }
}
Два объекта имеют один и тот же первичный ключ. Я создал классы конфигурации для сопоставления следующим образом:
public class CustomerConfiguration : EntityTypeConfiguration<Customer>
{
public CustomerConfiguration()
: base()
{
HasKey(p => p.AccountNumber);
Property(p => p.AccountNumber).
HasColumnName("cm_l_acct").
IsRequired();
Property(p => p.PhoneNumber).
HasColumnName("cm_s_phonenumber");
HasRequired(x => x.Address).
WithRequiredPrincipal(x => x.Customer).
Map(x => x.MapKey("am_l_acct"));
}
}
public class AddressConfiguration : EntityTypeConfiguration<Address>
{
public AddressConfiguration()
: base()
{
HasKey(p => p.AccountNumber);
Property(p => p.AccountNumber).
HasColumnName("am_l_acct").
IsRequired();
...
}
}
Отображение внешнего ключа выполняется только на одной стороне. Похоже, это сработало бы, если бы не тот факт, что столбец внешнего ключа также является первичным ключом таблицы. Когда я пытаюсь выполнить запрос, я получаю сообщение об ошибке:
(256,6): ошибка 0019: каждое имя свойства в типе должно быть уникальным. Имя свойства 'am_l_acct' уже определено.
К сожалению, я не могу извлечь сопоставление для свойства AccountNumber объекта Address, потому что это первичный ключ.
Есть ли способ, которым я могу выполнить это отображение, или это невозможно?