2012-11-06 2 views
3

В принципе, я пытаюсь достичь: у меня есть три таблицы, у одного родителя всегда будет запись, и будет заполняться только одна из двух других таблиц. Сложность, что я имею дело с том, что первичный ключ для таблиц является комбинацией двух полейКод элемента Entity Framework Сначала отношение «один к одному» на составном ключе

ParentTable 
----------- 
UniqueID 
OwnerID 
[Some more fields] 


ChildTable1 
----------- 
UniqueID 
OwnerID 
[Some more fields] 


ChildTable2 
----------- 
UniqueID 
OwnerID 
[Some more fields] 

мне было интересно, если кто имеет какие-либо предложения о том, как лучше всего сделать это с помощью EF Code First предпочтительно с использованием Свободный API.

ответ

7

Вам просто нужно определить, что первичные ключи являются составными ...

modelBuilder.Entity<Parent>().HasKey(p => new { p.UniqueID, p.OwnerID }); 
modelBuilder.Entity<Child1>().HasKey(c => new { c.UniqueID, c.OwnerID }); 
modelBuilder.Entity<Child2>().HasKey(c => new { c.UniqueID, c.OwnerID }); 

... а затем определим два один-к-одному отношения:

modelBuilder.Entity<Parent>() 
    .HasOptional(p => p.Child1) 
    .WithRequired(); // or .WithRequired(c => c.Parent) 

modelBuilder.Entity<Parent>() 
    .HasOptional(p => p.Child2) 
    .WithRequired(); // or .WithRequired(c => c.Parent) 

Вы не можете определить ограничение (хотя, возможно, определение триггера в базе данных), которое обеспечило бы, чтобы данный родитель мог ссылаться только на одного из двух детей, но не на обоих. Вы должны справиться с этим ограничением в бизнес-логике вашего приложения.

Смежные вопросы