Я использую 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", которого не существует.
ИЗМЕНИТЬ Чтобы уточнить, то, что я определил выше, может (и работает) работать, если ПК в "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 Я попробовал подход 1 к 1 снова в предложении 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 вызывает ошибку, потому что тогда сущность не имеет определенного ключа.