Я использую Entity Framework 4.3.1 Code-First, и мне нужно разделить сущность между двумя таблицами.Таблицы имеют общий первичный ключ, и он равен 1: 1, но столбцы не имеют одинаковых имен в каждой таблице.
Я не контролирую макет данных и не могу запрашивать какие-либо изменения.
Так, например, таблицы SQL могут быть
![SQL data tables](https://i.stack.imgur.com/p0UVF.png)
И это будет моя сущность ...
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», которого не существует.
EDIT Чтобы уточнить, чтоЯ определил выше, может (и действительно) работать, если 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
приводит к ошибке, потому что тогда у сущности нет определенного ключа.