Редактировать Я не уверен, что это действительно возможно, и вот почему:
Предполагается, что внешний ключ ссылается на первичный ключ.У вас есть два поля, которые оба выступают в качестве первичных ключей vwContact, но в зависимости от того, какой объект вы запрашиваете, это другое поле, которое является первичным ключом.Вы можете иметь только один первичный ключ одновременно, и, хотя у вас может быть составной первичный ключ, вы не можете выполнять первичные ключевые операции только с половиной его - у вас должен быть составной внешний ключ, с которым можно ссылаться на него.
Вот почему у Entity Framework нет способа указать столбец сопоставления на целевой стороне, потому что имеет для использования первичного ключа.
Теперь вы можете наложить слойеще несколько объектов поверх сущностей EF для ручного поиска и имитации свойств навигации, но я не думаю, что вы действительно можете заставить EF делать то, что вы хотите, потому что сам SQL не будет делать то, что вы хотите - правилоодин первичный ключ на таблицу, и он не подлежит обсуждению.
Исходя из того, что вы сказали о структуре вашей базы данных, вы можете написать сценарий миграции, который может дать контактным сущностям согласованный первичный ключ и обновить всеиначе ссылаться на них с этим единственным первичным ключом, а не двумя системами, полученными из устаревших данных, какВы можете, конечно, делать объединения на любые поля, которые вам нравятся.Я не думаю, что вы получите полностью функциональную модель EF без изменения базы данных.
Оригинальный ответ, который не сработает
Итак, vwContact
содержит ключ KeyField
, на который ссылаются многие SomeObject
s, и другой ключ LegacyKeyField
, на который ссылаются многие LegacyObject
s.
I думаю вот каквы должны подойти к этому:
Предоставить vwContact
свойства навигации для SomeObject
и LegacyObject
коллекций:
public virtual ICollection<SomeObject> SomeObjects { get; set; }
public virtual ICollection<LegacyObject> LegacyObjects { get; set; }
Дать эти свойства навигации внешним ключам для использования:
modelBuilder.Entity<vwContact>()
.HasMany(c => c.SomeObjects)
.WithRequired(s => s.Contact)
.HasForeignKey(c => c.KeyField);
modelBuilder.Entity<vwContact>()
.HasMany(c => c.LegacyObjects)
.WithRequired(l => l.Contact)
.HasForeignKey(c => c.LegacyKeyField);
Беда в том, что я думаю, вы уже пробовали это, и это не сработало, и в этом случае я не могу предложить вам больше, так как я не сделал огромное количество такого рода вещей (наша база данных намного ближе к тем вещам, которые ожидает EF, поэтому нам пришлось сделать относительно минимальные переопределения сопоставления, обычно с отношениями «многие ко многим».
Что касается ваших двух вызовов HasKey
onvwContact
, они не могут быть окончательным ключом для объекта, так что этоr составной ключ, который содержит оба из них, или выберите один, или есть другое поле, которое вы не упомянули, это первичный ключ real .Отсюда невозможно сказать, какой правильный вариант есть.