2012-01-09 2 views
0

У меня есть Entity, называемый User. Пользователь должен быть использован в многоязычной среде Так Пользователь выглядитОшибка удаления каскада в EF 4.2 (сначала код)

class User{ 
virtual ICollection<TextEntry> Name {get; set;} 
virtual ICollection<TextEntry> Info {get; set;} 
... 
} 

class TextEntry 
{ 
int id {get; set;} 
string Text {get; set;} 
string Culture {get;set;} 
} 

Также у меня есть правило для пользователя

modelBuilder.Entity<User>() 
     .HasMany(q => q.Name) 
     .WithOptional() 
     .WillCascadeOnDelete(); 

    modelBuilder.Entity<User>() 
     .HasMany(q => q.Info) 
     .WithOptional() 
     .WillCascadeOnDelete(); 

С этим правилом EF не может создать модель Esception сообщения является «Вводя ограничение внешнего ключа «User_Info» в таблице «TextEntry» может вызывать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. \ R \ nНевозможно создать ограничение. См. Предыдущие ошибки. "

Без этих правил я получаю исключение при попытке удалить пользователя из-за ограничений ссылок.

Как можно решить эту проблему при создании дополнительной сущности для данных User.Info?

ответ

1

Эта ошибка от SQL Server, а не от Entity Framework. Entity Framework создает одну таблицу для обоих экземпляров TextEntry.

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

+0

Но что, если у меня будет 3 или более поля, которые должны быть многоязычными? Я не думаю, что отличная идея создать новый экземпляр для нового поля. Потому что все они имеют одинаковую функциональность, но разные имена. – Ph0en1x

+0

@ Ph0en1x Да, правда. Но без создания базы данных вне Entity Framework с некоторыми пользовательскими частями (представления [могут помочь имитировать одну таблицу], триггеры [могут помочь на самом деле каскадировать] и т. Д.), Вы не будете двигаться намного дальше. –

+0

Я очень надеюсь, что этот вопрос можно решить с помощью трюка с правилами EF. – Ph0en1x

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