Entity Framework 4.1 Сначала сопоставление кода с таблицами, первичный ключ которых имеет столбец внешнего ключа - PullRequest
4 голосов
/ 15 февраля 2012

У меня есть существующая база данных, которую я использую 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, потому что это первичный ключ.

Есть ли способ, которым я могу выполнить это отображение, или это невозможно?

1 Ответ

3 голосов
/ 16 февраля 2012

Удалите это Map(x => x.MapKey("am_l_acct")) из вашего Customer отображения.Это отображение используется только в том случае, если вы хотите отобразить столбец FK в базе данных, и у вас нет свойства FK в классе, но оно есть - это первичный ключ в сущности Address.Если вы попытаетесь отобразить FK таким образом, EF решит, что вы пытаетесь создать столбцы с тем же именем.

...