2012-10-15 13 views
6

jestem pierwszy używając EF 5 kod i mam 2 Podmioty powiązane ApplicationPermission i zastosowanie:Jak mogę najpierw usunąć obiekt z właściwością nawigacji z kodem encji jednostki 5?

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; } 
} 

z poniższego mapowania dla ApplicationPermission:

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

i aplikacji:

HasKey(x => x.Id); 

Używam poniższego kodu do usuwania ApplicationPermission:

ApplicationPermission entity = new ApplicationPermission { Id = id }; 
DbContext.Set<ApplicationPermission>().Attach(entity); 
DbContext.Set<ApplicationPermission>().Remove(entity); 
DbContext.SaveChanges(); 

Ale mam błąd w metodzie SaveChanges:

podmiotów w 'CodeFirstContainer.ApplicationPermissions' uczestniczą w relacji 'ApplicationPermission_Application'. 0 powiązane Znaleziono "ApplicationPermission_Application_Target". 1 "ApplicationPermission_Application_Target" oczekuje się.

Jak mogę usunąć ApplicationPermission bez ładowania aplikacji do dbcontext?

Odpowiedz

3

Uważam, że nie można usunąć podmiotu bez ustawienia wymaganych właściwości nawigacyjnych podczas korzystania z niezależnych asocjacji . Musisz załadować Application z bazy danych lub - przynajmniej - zna wartości klucza obcego i dołączyć jednostkę Application z tej wartości, tak jak poniżej:

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(); 

Polecenie SQL generowany podczas rozmowy SaveChanges wynosi:

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

Jak widać zapytanie do delete nie tylko prosić o Id z ApplicationPermission do usunięcia, ale także (and) wartości klucza obcego dla ApplicationId. Aby odnieść sukces, musisz znać i ustawić tę wartość FK, ustawiając powiązaną jednostkę z tym samym kluczem podstawowym.

Problem nie występuje podczas korzystania klucz obcy stowarzyszenia:

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

    public int Id { get; set; } 
} 

Mapowanie:

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

Następnie można użyć oryginalnego kodu bez ustawiania właściwości FK ApplicationId do poprawnej wartości (domyślnie będzie to 0) i bez ustawienia właściwości nawigacji i usunięcie jednostki będzie działać. Polecenie SQL nie dba o FK i właśnie zapytuje dla Id z ApplicationPermission usunąć:

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

nie mam pojęcia dlaczego polecenia SQL są różne między dwoma rodzajami skojarzeń.

Powiązane problemy