2016-01-13 18 views
16

ben hatayıEntity Framework 7'de SİLİNİ SİLİNMEYİ AÇIKLAMA? İdare Framework 7'de

döngüleri veya çoklu kaskad yolları neden olabilir masaya 'ChangeOrder' üzerine FOREIGN KEY kısıtlaması 'FK_ChangeOrder_User_CreatedByID' Tanıtımı olsun bir göç uygulamak için çalışıyorum. EYLEM YAPMAK ÜZERİNDE AÇIK veya EYLEM OLMADAN AÇIKLAMAK seçin veya diğer ÖNSÖZ ANAHTAR kısıtlamalarını değiştirin.
Kısıtlama oluşturulamadı. Önceki hataları görün.

Buna bir .Conventions sahip görünmüyor DBContext ama EF7 modelBuilder yılında

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

ekleyerek bunun üstesinden Varlık Framework eski sürümlerinde biliyoruz ve google sadece eski dönüyor EF 4 olsa da EF 6 sonuçları.

Entity Framework 7'de ON DELETE NO ACTION kısıtlamasına nasıl emin olabilirim?

Edit: Oleg tarafından sağlanan cevap görünüşe göre Yabancı Anahtar başına yapacaktır ama bunu küresel olarak ilan etmek için bir satır kod kullanmak çok daha kolay olacağı için bunu yapmak için genel olarak bunu yapmak istiyorum. sahip olduğum yüzlerce ilişkiden her biri.

Düzenleme 2: Kod Oleg

public class ChangeOrder 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    public Int16? ApprovedByID { get; set; } 
    public Byte ApprovalStatusID { get; set; } 
    public Int16 AssignedToID { get; set; } 
    public Int16 CreatedByID { get; set; } 
    public Byte CurrentStatusID { get; set; } 
    public DateTime? DateApproved { get; set; } 
    public DateTime? EndDate { get; set; } 
    public Byte ImpactID { get; set; } 
    public Byte PriorityID { get; set; } 
    public DateTime? StartDate { get; set; } 
    public Byte TypeID { get; set; } 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    public string ReasonForChange { get; set; } 

    [ForeignKey("ApprovedByID")] 
    public User ApprovedBy { get; set; } 

    [ForeignKey("ApprovalStatusID")] 
    public ChangeApprovalStatus ApprovalStatus { get; set; } 

    [ForeignKey("AssignedToID")] 
    public User AssignedTo { get; set; } 

    [ForeignKey("CreatedByID")] 
    public User CreatedBy { get; set; } 

    [ForeignKey("ImpactID")] 
    public ChangeImpact Impact { get; set; } 

    [ForeignKey("PriorityID")] 
    public ChangePriority Priority { get; set; } 

    [ForeignKey("TypeID")] 
    public ChangeType ChangeType { get; set; } 

    [ForeignKey("CurrentStatusID")] 
    public ChangeStatus CurrentStatus { get; set; } 
} 
public class JobSightDBContext : DbContext 
{ 
    protected override void OnModelCreating(ModelBuilder modelbuilder) 
    { 
     base.OnModelCreating(modelbuilder); 
    } 

    DbSet<ChangeApprovalStatus> ChangeApprovalStatus { get; set; } 
    DbSet<ChangeImpact> ChangeImapct { get; set; } 
    DbSet<ChangeOrder> ChangeOrders { get; set; } 
    DbSet<ChangePriority> ChangePriorities { get; set; } 
    DbSet<ChangeStatus> ChangeStatus { get; set; } 
    DbSet<ChangeType> ChangeTypes { get; set; } 
    DbSet<User> Users { get; set; } 
} 

cevap

25

: Örneğin, aşağıdaki kod, diğer yabancı anahtarlar (yabancı anahtarların üzerinde hiçbir ON DELETE) ve DeleteBehavior.Restrict (yabancı tuşları ON DELETE CASCADE yaratır) CreatedByID üzerine DeleteBehavior.Cascade kullanır GitHub üzerinde MS'den çok patent adam şimdiki çözüm global yapabilir veya ben sahip ilişkilerin yüzlerce her biri için bunu yapmak zorunda yapmanın bir yolu var mı DBContext

protected override void OnModelCreating(ModelBuilder modelbuilder) 
{ 
    foreach (var relationship in modelbuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys())) 
    { 
     relationship.DeleteBehavior = DeleteBehavior.Restrict; 
    } 

    base.OnModelCreating(modelbuilder); 
} 
+0

bu benim hayatımı kurtardı !!!!! Çok sayıda FK meselesini ele geçiriyordum. Bir milyon teşekkür ederim !!!!!!!!!!!!!! –

10

modelBuilder.Entity("myNamespace.Models.ChangeOrder", b => 
    { 
     b.HasOne("myNamespace.Models.User") 
      .WithMany() 
      .HasForeignKey("CreatedByID") 
      .OnDelete(DeleteBehavior.Cascade); 
    }); 

irade REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE ile FK_ChangeOrder_User_CreatedByID oluşturmak demektir inşaat için. Geçiş sırasında oluşturulan protected override void BuildModel(ModelBuilder modelBuilder)YourContextModelSnapshot.cs sürümünde bulunmalıdır. Sorunuzu tam olarak anladığımdan emin değilim, ancak bence bu tür yapıları XXXModelSnapshot.cs'a eklemeniz veya burada mevcut olan gereksiz yapıyı kaldırmanız gerektiğini düşünüyorum.

GÜNCELLENMİŞ: Modelde sorun olduğunu görüyorsunuz. Tüm özelliklerine DeleteBehavior.Cascade ayarlamak için denemek varsayılan göç By

public Int16? ApprovedByID { get; set; } 
public Int16 AssignedToID { get; set; } 
public Int16 CreatedByID { get; set; } 

// navigation properties 

[ForeignKey("ApprovedByID")] 
public User ApprovedBy { get; set; } 

[ForeignKey("AssignedToID")] 
public User AssignedTo { get; set; } 

[ForeignKey("CreatedByID")] 
public User CreatedBy { get; set; } 

aşağıdaki özelliklere sahiptir.

Sen DeleteBehavior.Restrict tüm anahtarlar için davranış ya sadece DeleteBehavior.Cascade veya DeleteBehavior.SetNull davranışı anahtar biri üzerinde ya koyan OnModelCreating değiştirerek davranışı üzerine yazabilirsiniz. GitHut etrafında kazma ve birlikte çalıştıktan sonra

public class JobSightDBContext : DbContext 
{ 
    protected override void OnModelCreating(ModelBuilder modelbuilder) 
    { 
     base.OnModelCreating(modelbuilder); 

     modelbuilder.Entity(typeof (ChangeOrder)) 
      .HasOne(typeof (User), "ApprovedBy") 
      .WithMany() 
      .HasForeignKey("ApprovedByID") 
      .OnDelete(DeleteBehavior.Restrict); // no ON DELETE 
     modelbuilder.Entity(typeof (ChangeOrder)) 
      .HasOne(typeof (User), "AssignedTo") 
      .WithMany() 
      .HasForeignKey("AssignedToID") 
      .OnDelete(DeleteBehavior.Restrict); // no ON DELETE 
     modelbuilder.Entity(typeof (ChangeOrder)) 
      .HasOne(typeof (User), "CreatedBy") 
      .WithMany() 
      .HasForeignKey("CreatedByID") 
      .OnDelete(DeleteBehavior.Cascade); // set ON DELETE CASCADE 
    } 

    DbSet<ChangeApprovalStatus> ChangeApprovalStatus { get; set; } 
    DbSet<ChangeImpact> ChangeImapct { get; set; } 
    DbSet<ChangeOrder> ChangeOrders { get; set; } 
    DbSet<ChangePriority> ChangePriorities { get; set; } 
    DbSet<ChangeStatus> ChangeStatus { get; set; } 
    DbSet<ChangeType> ChangeTypes { get; set; } 
    DbSet<User> Users { get; set; } 
} 
+0

bu eklemektir?Bu şekilde yapmak benim için fazladan kodlar yaratacaktır ve bunu yapmaktan kaçınmayı tercih ederim. – Matthew

+0

@MatthewVerstraete: Sadece hata mesajını almayı zorlaştırıyor. İlk önce birçok veri notasına sahip bir dizi sınıf oluşturduğunuzu ve daha sonra 'dbSontext' türetilmiş 'XXXContext' türetilmiş 'public DbSet Users {get; set; }, 'public DbSet ChangeOrders {get; set; } '. “Kullanıcı”, “ChangeOrder” daki bazı tanımların EF Migration tarafından yanlış bir şekilde yorumlanacağını, ancak tam olarak ne olabileceğini tahmin edemeyeceğimi düşünüyorum. Nedeni bulmak için tam Model analiz etmek için bir nee. – Oleg

+0

Sorunlarınızın neler anladığından emin değil misiniz? ModelBuilder.Conventions.Remove (); 'ın EF7 sürümünü arıyorum ama DBContext'i ekledim ve – Matthew