2017-03-31 5 views
1

다음과 같이 나는 (내가 먼저 코드를 사용) 일대 다 관계로 연결된 두 기관이 : 나는 하나 또는 여러 스크린에 연결된 컴퓨터를 삭제하면EF로 캐스케이드 삭제를 비활성화 하시겠습니까?

public class Computer 
{ 
    [Key] 
    public int ComputerId { get; set; } 

    [Required] 
    public int ComputerIdInventory { get; set; } 

    [DataType(DataType.Date)] 
    public DateTime? AcquisitionDate { get; set; } 

    [DataType(DataType.Date)] 
    public DateTime? LastUpdate { get; set; } 

    public string Comment { get; set; } 

    //Foreign keys 
    public int? ComputerModelId { get; set; } 

    public int? EmployeeId { get; set; } 

    //Navigation properties 
    public virtual ICollection<Screen> Screens { get; set; } 
} 

public class Screen 
{ 
    [Key] 
    public int ScreenId { get; set; } 

    [Required] 
    public int ScreenIdInventory { get; set; } 

    public string Comment { get; set; } 

    //Foreign keys 
    public int? ComputerId { get; set; } 

    //Navigation properties 
    public virtual Computer Computer { get; set; } 
} 

, 나는 다음과 같은 한 오류 :

[SqlException (0x80131904): The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.Screen_dbo.Computer_ComputerId". The conflict occurred in database "CPInventory", table "dbo.Screen", column 'ComputerId'.

나는 많은 게시물을 읽었으며 다른 사람들을 위해 일한 것으로 보인 2 가지를 시도했다. 나는 "OnModelCreating"방법을 변경 및 추가 :

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 

을 그리고 나도이 시도 :

modelBuilder.Entity<Computer>() 
      .HasMany<Screen>(c => c.Screens) 
      .WithOptional(s => s.Computer) 
      .WillCascadeOnDelete(false); 

그러나 해결책으로는 ... 내가 뭔가 잘못하고없는 건가요 일했다? 또한 데이터베이스를 업데이트하지만 아무 것도 변경되지 않았습니다. 변경 사항을 고려하기 위해 데이터베이스를 완전히 삭제하고 다시 만들어야합니까?

고맙습니다.

편집

: 여기 은 삭제 코드

public ActionResult DeleteConfirmed(int id) 
    { 
     Computer computer = db.Computers.Find(id); 
     db.Computers.Remove(computer); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
+0

유창 구성이 괜찮 저장 컴퓨터

db.Set<Computer>().Remove(computer); 

을 삭제, 문제는 다르다. 삭제 코드를 공유 할 수 있습니까? –

답변

0

화면에 컴퓨터의 ComputerId과 일치하는 ComputerId이있는 컴퓨터는 삭제할 수 없습니다.

그래서 화면을 업데이트 :

screen.ComputerId = null; 

다음 다음 변경

db.SaveChanges(); 
+0

@Erik에 감사드립니다! 내가 월요일에 일하러 돌아와서 이걸 시험해 볼게! :) – Pookye

+0

고마워요! 사실 나는 @ 데이비드에 의해 제안 대답을 사용 : stackoverflow.com/a/33914071/532616 나는 그것이 당신이 제안한 것과 거의 같다고 생각합니다 !! 고맙습니다 ! – Pookye

0
입니다

문제는 당신이 자식 행이 (가있는 경우 상위 행 (컴퓨터를) 삭제할 수 없습니다 말한다 데이터베이스의 외래 키 제약 조건이있다 화면).

처음부터 계단식 삭제 기능이 있기 때문에 컴퓨터를 삭제해도 화면이 삭제됩니다.

유일한 다른 옵션은 컴퓨터를 삭제하기 전에 동일한 ComputerID를 가진 모든 화면을 삭제하는 것입니다. (또는 캐스케이드 삭제를 켜고 프레임 워크에서 처리하도록하지 않는 이유는 무엇입니까?)

+0

데이비드 감사합니다. 문제는 내가 컴퓨터를 지우더라도 화면을 유지하고 캐스케이드가 켜지지 않았기 때문입니다. 컴퓨터를 삭제할 수 없습니다. – Pookye

+0

나는 소프트 삭제 (http://stackoverflow.com/questions/2549839/are-soft-deletes-a-good-idea)를 사용하여 실제로 컴퓨터를 삭제하지 말고 대신 비트 열을 테이블에 삭제하도록 제안합니다. '삭제 된'컴퓨터의 경우이 값을 True로 설정하십시오. – David

+0

또는이 답변은 원하는 것과 같습니다. http://stackoverflow.com/a/33914071/532616 – David