2012-05-03 4 views
15

В настоящее время я использую EF Code First 4.3 с включенными миграциями, но автоматическая миграция отключена.Entity Framework Data Аннотации, эквивалентные .WillCascadeOnDelete (false);

Мой вопрос прост, есть аннотации данных эквивалент .WillCascadeOnDelete конфигурации модели (ложного)

Я хотел бы украсить свой класс, так что иностранные ключевые отношения не вызывают каскадное удаление.

Пример кода:

public class Container 
{ 
    public int ContainerID { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Output> Outputs { get; set; } 
} 

public class Output 
{ 
    public int ContainerID { get; set; } 
    public virtual Container Container { get; set; } 

    public int OutputTypeID { get; set; } 
    public virtual OutputType OutputType { get; set; } 

    public int Quantity { get; set; } 
} 

public class OutputType 
{ 
    public int OutputTypeID { get; set; } 
    public string Name { get; set; } 
} 

Я хотел бы сделать что-то вроде этого:

public class Output 
{ 
    [CascadeOnDelete(false)] 
    public int ContainerID { get; set; } 
    public virtual Container Container { get; set; } 

    [CascadeOnDelete(false)]  
    public int OutputTypeID { get; set; } 
    public virtual OutputType OutputType { get; set; } 

    public int Quantity { get; set; } 
} 

Таким образом, я смог бы правильно эшафот миграцию. который заставляет внешние отношения влиять на каскад в данный момент.

Любые идеи, кроме использования конфигурации модели?

+0

тот же вопрос. Нашел, как включить его [здесь] (http://stackoverflow.com/a/33276901/4625305), но я хочу отключить его только для одной связи. – AXMIM

ответ

19

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

+0

удалит соглашение OneToManyCascadeDelete, удалите соглашение, даже если вы добавляете аннотации, такие как [Требуется] к внешнему ключу? – FRoZeN

+0

Cascade delete должен использоваться только для отношений, которые требуются, и удаление этого соглашения нарушит его. Необязательно задано значение null. –

+0

В случае использования OneToManyCascadeDelete = false, как бы включить каскадное удаление выборочно с аннотациями данных? – ironic

2

Создать класс отображения (беглый синтаксис) и использовать код ниже:

// add relationships "Post" and "User" to a "Comment" entity 
this.HasRequired(t => t.Post) 
    .WithMany(t => t.Comments) 
    .HasForeignKey(d => d.PostID) 
    .WillCascadeOnDelete(false); // <--- 

this.HasOptional(t => t.User) 
    .WithMany(t => t.Comments) 
    .HasForeignKey(d => d.UserID) 
    .WillCascadeOnDelete(false); // <--- 

Вот nice post о том, как настроить беглые отображения, если вам нужно больше информации.

+0

Ссылка есть сломана. – AXMIM

0

Просто сделать свойство обнуляемым FK может предотвратить каскадное удаление от случаться:

public int? OutputTypeID { get; set; }