Я использую 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 */
Редактировать Я попробовал 1 -to-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"));
Вернуться s это сообщение
"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
класса выдает ошибку, потому что тогда объект не имеет определенного ключа.
Ах! поэтому «ExtendedTable» не находится в схеме, которую вы создаете; если вы просто сдуваете и создаете новую базу данных через DropCreateDatabaseAlways, тогда нет способа сопоставления с несуществующей таблицей; единственный способ состоит в том, чтобы включить эту таблицу как часть схемы или иметь предварительно установленный БД с «расширенной таблицей» уже там и использовать миграцию кода EF 4.3 для изменения базы данных, противоположной созданию нового. –
Я не уверен, что следую тому, что вы имеете в виду, но это существующая схема базы данных. Фактически, это сопоставление с базой данных DB2 на мэйнфрейме. Я не хочу, чтобы EF пытался сбросить или создать что-либо. – Josh
Привет, Джош У меня такая же проблема, и выложили ее здесь на форумах EF [здесь] (http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/be9f5e6a-e5bf-45a6-b86a -b2a74cfda105), им не повезло. Вы слышали от какой-либо команды EF? – TheDuke