2012-10-15 11 views
6

İlk EF 5 kod kullanıyorum ve 2 ile ilgili varlıklar ApplicationPermission ve Uygulama sahiptir:İlk önce varlık çerçevesi 5 koduyla gezinti özelliği olan bir nesneyi nasıl silebilirim?

HasKey(x => x.Id); 
HasRequired(x => x.Application).WithMany().Map(m => m.MapKey("ApplicationId")).WillCascadeOnDelete(false); 

ve Uygulaması:

HasKey(x => x.Id); 
ApplicationPermission için aşağıdaki haritalama ile

public class ApplicationPermission 
{ 
    public virtual Application Application { get; set; } 

    public int Id { get; set; } 
} 

public class Application 
{ 
    public string Name { get; set; } 

    public int Id { get; set; } 
} 

ApplicationPermission:

ürününü silmek için aşağıdaki kodu kullanıyorum
ApplicationPermission entity = new ApplicationPermission { Id = id }; 
DbContext.Set<ApplicationPermission>().Attach(entity); 
DbContext.Set<ApplicationPermission>().Remove(entity); 
DbContext.SaveChanges(); 

Ama SaveChanges yöntem üzerinde bir hata var: 'CodeFirstContainer.ApplicationPermissions' 'ApplicationPermission_Application' ilişki katılmak içinde

Varlıkları. 0 ilgili 'ApplicationPermission_Application_Target' bulundu. 1 'ApplicationPermission_Application_Target' bekleniyor.

Yüklemeden ApplicationPermission'ı uygulamadan nasıl silebilirim dbcontext?

cevap

3

bağımsız dernekler'u kullanırken gerekli gezinme özelliklerini ayarlamadan bir varlığı silmek mümkün olmadığına inanıyorum. Sen veritabanından Application yüklemek veya olmalıdır - en azından - yabancı anahtar değerini bilmek ve böylece gibi, bu değerle bir Application varlığı tutturmak:

ApplicationPermission entity = new ApplicationPermission { Id = 1 }; 
entity.Application = new Application { Id = 5 }; 
DbContext.Set<ApplicationPermission>().Attach(entity); //attaches Application too 
DbContext.Set<ApplicationPermission>().Remove(entity); 
DbContext.SaveChanges(); 

Eğer SaveChanges çağırdığınızda oluşturulan SQL komutu o zaman:

exec sp_executesql N'delete [dbo].[ApplicationPermissions] 
where (([Id] = @0) and ([ApplicationId] = @1))',N'@0 int,@1 int',@0=1,@1=5 

Eğer delete için sorgu yalnızca ayrıca silmek ApplicationPermission arasında Id ama (and) ApplicationId için yabancı anahtar değeri istemez görebileceğiniz gibi. Başarılı olmak için, ilgili varlığı aynı ana anahtarla ayarlayarak bu FK değerini bilmeli ve ayarlamalısınız. yabancı anahtar ilişkilendirmeleri kullanırken

sorun oluşmaz:

public class ApplicationPermission 
{ 
    public virtual Application Application { get; set; } 
    public int ApplicationId { get; set; } 

    public int Id { get; set; } 
} 

Haritalama:

modelBuilder.Entity<ApplicationPermission>() 
    .HasRequired(x => x.Application) 
    .WithMany() 
    .HasForeignKey(x => x.ApplicationId) 
    .WillCascadeOnDelete(false); 

Daha sonra doğru bir değere FK özelliğini ApplicationId ayarlamadan orijinal kodu kullanabilirsiniz (varsayılan olarak 0 için varsayılan olacaktır) ve navigasyon özelliğini ayarlamadan ve silme işlemi çalışacaktır. SQL komutu FK hakkında bakım ve sadece ApplicationPermission ait Id silmek için sorgular vermez:

exec sp_executesql N'delete [dbo].[ApplicationPermissions] 
where ([Id] = @0)',N'@0 int',@0=1 

SQL komutları derneklerin iki tür arasında farklı neden hiçbir fikrim yok.