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