Что не так с этим отображением? - PullRequest
2 голосов
/ 19 октября 2011

Я хочу создать следующую таблицу на основе словаря ниже класса.Я получаю исключение, когда добавляю записи.Что не так с этим отображением?Этот код работает, если я указываю свойство Child класса "B" на другой класс (пример "C").

database table 
    table A {id, name}
    table B {parentId, childId, Type}

Класс и отображение

Public class A
{
   public int Id {get;set;}
   public string Description {get;set;}
}

Public class B
{
   [Key, Column(Order=0)]
   public int ParentId {get;set;}
   [Foreignkey("ParentId")]
   public A Parent {get;set;}

   [Key, Column(Order=1)]
   public int ChildId {get;set;}
   [Foreignkey("ChildId")]
   public A Child {get;set;}

   [Key, Column(Order=2)]
   public string Type {get;set;}

}

ОБНОВЛЕНИЕ

Сообщение об ошибке: Введение ограничения FOREIGN KEY 'B_Parent'в таблице' B 'может вызвать циклы или несколько каскадных путей.Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, либо измените другие ограничения FOREIGN KEY.Не удалось создать ограничение.Смотрите предыдущие ошибки.

Спасибо,

Ашраф

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

После прочтения следующих постов я нашел решение.http://weblogs.asp.net/manavi/archive/2011/05/01/associations-in-ef-4-1-code-first-part-5-one-to-one-foreign-key-associations.aspx

Код Entity Framework First - Определение отношений / ключей

Это ошибка SQL Server.Класс «А» дважды ссылается на класс «В».Код Первая попытка включить каскадное удаление для обоих столбцов «Родитель» и «Дочерний» в классе «B», что вызывает исключение.

Исправление вручную отменяет один из параметров каскада на «ложь» в классе B. Я не знаюКак установить опцию CascadeOnDelete в качестве атрибута словаря.Но вот беглый API.

 HasRequired(x => x.Parent)
         .WithMany()
         .HasForeignKey(x => x.ParentId)
         .WillCascadeOnDelete(false);

Я хочу, чтобы команда EF попыталась написать для нас подробное руководство по настройке Code First (Fluent API).База данных AdventureWorks-2008 - отличный кандидат для этого.

0 голосов
/ 19 октября 2011

это исключение относится только к SQL-серверу. Оно исчезнет, ​​если вы отключите каскад для отношений. По умолчанию Ef включит его для вас. Вы можете сделать это через свободный API. В отношениях просто добавьте следующую конфигурацию

.WillCascadeOnDelete(false);

надеюсь, это поможет.

...