Разделение сущностей, когда ключевой столбец имеет разные имена?

Я использую Entity Framework 4.3.1 Code-First, и мне нужно разделить сущность между двумя таблицами. Таблицы имеют общий первичный ключ, и он равен 1: 1, но столбцы не имеют одинаковых имен в каждой таблице.

Я не контролирую расположение данных и не могу запрашивать какие-либо изменения.

Так, например, таблицы SQL могут быть

И это будет моя сущность ...

public class MyEntity
{
    public int Id {get; set;}
    public string Name {get;set}
    public string FromAnotherTable {get;set;}
}

И вот картография у меня есть.

public class MyEntityMapping : EntityTypeConfiguration<MyEntity>
{
    public MyEntityMapping()
    {
        this.Property(e => e.Id).HasColumnName("ThePrimaryKeyId");
        this.Property(e => e.Name).HasColumnName("MyDatabaseName");
        this.Property(e => e.FromAnothertable).HasColumnName("AnotherTableColumn");
        this.Map(m =>
            {
                m.Properties(e =>
                     {
                         e.Id,
                         e.Name
                     });
                m.ToTable("MainTable");
            });
        this.Map(m =>
            {
                m.Properties(e =>
                     {
                         e.Id,
                         e.FromAnotherTable
                     });
                m.ToTable("ExtendedTable");
            });
}

Поскольку ключ, которым они обмениваются, имеет другое имя столбца, я не уверен, как сопоставить его. Это сопоставление будет скомпилировано, но завершится неудачно во время выполнения, поскольку EF испускает SQL, ища столбец «ThePrimaryKeyId» в таблице «ExtendedTable», который не существует.

РЕДАКТИРОВАТЬ Чтобы уточнить, что я определил выше, может (и работает), если PK в «ExtendedTable» следовал соглашениям по присвоению имен. Но это не так, и я не могу изменить схему.

По сути, EF для генерации требуется SQL-выражение

SELECT
    [e1].*,   /*yes, wildcards are bad. doing it here for brevity*/
    [e2].*
FROM [MainTable] AS [e1]
INNER JOIN [ExtendedTable] AS [e2]  /*Could be left join, don't care. */
    ON  [e1].[ThePrimaryKeyId] = [e2].[NotTheSameName]

Но единственное, что он хочет выбросить, это

 SELECT
        [e1].*,
        [e2].*
    FROM [MainTable] AS [e1]
    INNER JOIN [ExtendedTable] AS [e2]
        ON  [e1].[ThePrimaryKeyId] = [e2].[ThePrimaryKeyId] /* this column doesn't exist */

редактировать Я снова попробовал подход 1 к 1 по предложению Н.С.Гага. Это не сработало, но вот результаты. юридические лица

public class MyEntity
{
    public int Id { get; set; }
    public int Name { get; set; }
    public virtual ExtEntity ExtendedProperties { get; set; }
}
public class ExtEntity
{
    public int Id { get; set; }
    public string AnotherTableColumn { get; set; }
    public virtual MyEntity MainEntry { get; set; }
}

Вот классы отображения

public class MyEntityMapping : EntityTypeConfiguration<MyEntity>
{
    public MyEntityMapping()
    {
        this.Property(e => e.Id).HasColumnName("ThePrimaryKeyId");
        this.Property(e => e.Name).HasColumnName("MyDatabaseName");
        this.ToTable("MainTable");
        this.HasKey(e => e.Id);
        this.HasRequired(e => e.ExtendedProperties).WithRequiredPrincipal(f => f.MainEntry);
    }
}

public class ExtEntityMapping : EntityTypeConfiguration<ExtEntity>
{
    public ExtEntityMapping()
    {
        this.Property(e => e.Id).HasColumnName("NotTheSameName");
        this.Property(e => e.AnotherTableColumn).HasColumnName("AnotherTableColumn");
        this.ToTable("ExtendedTable");
        this.HasKey(e => e.Id);
        this.HasRequired(e => e.MainEntry).WithRequiredDependent(f => f.ExtendedProperties);
    }
}

Эта настройка получает сообщение

"Column or attribute 'MyEntity_ThePrimaryKeyId' is not defined in 'ExtendedTable'"

Изменение последней строки карты на

this.HasRequired(e => e.MainEntry).WithRequiredDependent(f => f.ExtendedProperties).Map(m => M.MapKey("NotTheSameName"));

Возвращает это сообщение

"Each property name in a type must be unique. property name 'NotTheSameName' was already defined."

Изменение сопоставленного ключа для использования столбца из родительской таблицы,MapKey("ThePrimaryKeyId"), возвращает это сообщение

"Column or attribute 'ThePrimaryKeyId' is not defined in 'ExtendedTable'"

УдалениеId собственность отExtEntity Класс выдает ошибку, потому что тогда у сущности нет определенного ключа.

Ответы на вопрос(7)

Ваш ответ на вопрос