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

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

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

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

SQL data tables

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

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», которой не существует.

ИЗМЕНИТЬ Чтобы уточнить, то, что я определил выше, может (и работает) работать, если ПК в «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 */

Edit Я снова попробовал подход «один к одному» по предложению NSGaga. Не сработало, но вот результаты. Сущности

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 вызывает ошибку, потому что в этом случае объект не имеет определенного ключа.

12
задан Josh 26 March 2012 в 20:32
поделиться