2013-08-16 1 views
1

EF 코드 첫 번째 방법을 사용하여 유창한 구문으로 외래 키 관계 함을 만들려고합니다. 다음과 같이 내가 유창하게 API를 사용하여 데이터베이스 생성에 대한 코드 첫 번째 방법을 시도하고EF 코드 첫 번째 접근법 : EF에서 혼란 스럽네요. 유창한 구문에 의한 외래 키 제약

public partial class Defect 
{ 
    public int DefectID { get; set; } 
    public decimal ReleaseNo { get; set; } 
    public int BuildNo { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string StepsToReproduce { get; set; } 
    public int ApplicationModuleID { get; set; } 
    public int SeverityLevel { get; set; } 
    public string LoggedBy { get; set; } 
    public Nullable<System.DateTime> LoggedOn { get; set; } 
    public string LastModifiedBy { get; set; } 
    public Nullable<System.DateTime> LastModifiedOn { get; set; } 
    public string AssignedTo { get; set; } 
    public string Status { get; set; } 
    public string ResolutionNote { get; set; } 
    public Nullable<System.DateTime> ResolvedOn { get; set; } 
    public int ProjectID { get; set; } 

    public virtual SeverityIndex SeverityIndex { get; set; } 
    public virtual User LoggedByUser { get; set; } 
    public virtual User LastModifiedUser { get; set; } 
    public virtual User AssignedToUser { get; set; } 
    public virtual Project Project { get; set; } 

} 
public class DefectMap:EntityTypeConfiguration<Defect> 
{ 
    public DefectMap() 
    { 
     this.HasKey(d => d.DefectID); 
     this.ToTable("Defect"); 
     this.Property(d => d.DefectID) 
      .IsRequired() 
      .HasColumnName("DefectID") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     this.Property(d => d.Description) 
      .IsRequired() 
      .IsUnicode() 
      .IsVariableLength() 
      .HasMaxLength(2000) 
      .HasColumnName("Description") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     this.Property(d => d.StepsToReproduce) 
      .IsOptional() 
      .IsUnicode() 
      .IsVariableLength() 
      .HasMaxLength(4000) 
      .HasColumnName("StepsToReproduce") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     this.Property(d => d.LastModifiedBy) 
      .IsOptional() 
      .IsUnicode() 
      .IsVariableLength() 
      .HasMaxLength(10) 
      .HasColumnName("LastModifiedBy") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     this.Property(d => d.AssignedTo) 
      .IsOptional() 
      .IsUnicode() 
      .IsVariableLength() 
      .HasMaxLength(10) 
      .HasColumnName("AssignedTo") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     this.Property(d => d.Status) 
      .IsOptional() 
      .IsUnicode() 
      .IsVariableLength() 
      .HasMaxLength(50) 
      .HasColumnName("Status") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     this.Property(d => d.ResolutionNote) 
      .IsOptional() 
      .IsUnicode() 
      .IsVariableLength() 
      .HasMaxLength(4000) 
      .HasColumnName("ResolutionNote") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

     this.HasRequired(p => p.Project).WithMany(p => p.DefectList).HasForeignKey(p => p.ProjectID); 
     this.HasRequired(s => s.SeverityIndex).WithMany(s => s.DefectList).HasForeignKey(s => s.SeverityLevel).WillCascadeOnDelete(); 
     this.HasOptional(u => u.AssignedToUser).WithMany(u => u.AssignedToUserList).HasForeignKey(u => u.AssignedTo).WillCascadeOnDelete(); 
     this.HasOptional(u => u.LastModifiedUser).WithMany(u => u.ModifiedByUserList).HasForeignKey(u => u.LastModifiedBy); 
     this.HasRequired(u => u.LoggedByUser).WithMany(u => u.LoggedByUserList).HasForeignKey(u => u.LoggedBy); 
    } 
public partial class Project 
{ 
    public Project() 
    { 
     ApplicationModuleList = new List<ApplicationModule>(); 
     DefectList = new List<Defect>(); 
     UserList = new List<User>(); 
    } 

    public int ID { get; set; } 
    public string ProjectName { get; set; } 
    public string ProjectManager { get; set; } 
    public Nullable<System.DateTime> ProjectStartDate { get; set; } 
    public Nullable<System.DateTime> ProjectEstimatedEndDate { get; set; } 
    public Nullable<System.DateTime> ProjectActualEndDate { get; set; } 
    public Nullable<int> ProjectBillingModel { get; set; } 
    public Nullable<decimal> ProjectEstimatedBudget { get; set; } 
    public Nullable<decimal> ProjectActualBudget { get; set; } 
    public Nullable<int> ProjectPortfolio { get; set; } 
    public Nullable<decimal> ProjectBillingRate { get; set; } 
    public Nullable<int> ProjectEstimatedManHours { get; set; } 
    public Nullable<int> ProjectActualManHours { get; set; } 
    public Nullable<int> ProjectIsApproved { get; set; } 

    public virtual ICollection<ApplicationModule> ApplicationModuleList { get; set; } 
    public virtual ICollection<Defect> DefectList { get; set; } 
    public virtual ICollection<User> UserList { get; set; } 
    public virtual BillingModel BillingModel { get; set; } 
    public virtual Portfolio Portfolio { get; set; } 
    public virtual ApprovalStatus ApprovalStatus { get; set; } 
} 
public class ProjectMap:EntityTypeConfiguration<Project> 
{ 
    public ProjectMap() 
    { 
     this.HasKey(p => p.ID); 
     this.ToTable("Projects"); 
     this.Property(p => p.ID) 
      .HasColumnName("ID") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) 
      .IsRequired(); 
     this.Property(p => p.ProjectName) 
      .HasColumnName("ProjectName") 
      .HasMaxLength(200) 
      .IsRequired() 
      .IsVariableLength() 
      .IsUnicode() 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

     this.HasOptional(p => p.BillingModel).WithMany(p=>p.Projects).HasForeignKey(p => p.ProjectBillingModel).WillCascadeOnDelete(); 
     this.HasOptional(p => p.Portfolio).WithMany(p=>p.Projects).HasForeignKey(p => p.ProjectPortfolio).WillCascadeOnDelete(); 
     this.HasOptional(p => p.ApprovalStatus).WithMany(p=>p.Projects).HasForeignKey(p => p.ProjectIsApproved).WillCascadeOnDelete(); 
    } 
} 

내 엔티티입니다. 나는이 코드를 실행하면

그러나 나는 오류가 사이클 또는 여러 개의 계단식 경로를 일으킬 수 테이블 '사용자'에 FOREIGN KEY 제약 조건 'FK_dbo.User_dbo.Projects_ProjectID'를 소개

*

말을 얻는다. NO DELETE NO ACTION 또는 UP UP NO NO ACTION을 지정하거나 다른 FOREIGN KEY 제약 조건을 수정하십시오. 제약 조건을 만들 수 없습니다. 이전 오류 참조 *

AssignedTo 열에도 같은 오류가 나타납니다.

여기서는 프로젝트에 많은 결함이있을 수 있으며 결함에는 연결된 프로젝트 ID가 있어야합니다 (예 : 프로젝트와 결함 간의 일대 다 관계).

누구나 코드에 무엇이 잘못 되었는가를 제안 할 수 있습니까? 코드를 수정하여 정상적으로 작동하게해야합니까?

미리 감사드립니다.

답변

1

EF에는 기본적으로 계단식 삭제가 설정되어 있으며 오류 메시지에 따라 디자인에 문제가 발생할 수 있습니다.

어느 다음

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
      modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
    } 

또는

+0

감사 키얼 스틴 당신의 유창 API에

WillCascadeOnDelete(false) 

을 포함 추가! 그게 .. 내가 계단식 삭제 메서드 호출을 제거했습니다. 그러나 나는 정확히 무엇이 문제인지 궁금하다. 내 디자인에 결함이 있습니까? 캐스케이드 삭제로 인해 오류가 발생할 수 있습니까? 외래 키 관계를 작성하는 또 다른 방법이 있습니까? EF에서 계단식 삭제가 삭제로 활성화되어 있습니다. 하지만 내 코드에서 해봤을 때 ... 삭제를 허용하지 않았다. 이에 대한 구체적인 이유는 무엇입니까? 친절하게 호기심을 도와주세요 !!! 미리 감사드립니다. –

+0

"캐스케이드 삭제가 삭제로 활성화되었습니다."라고 말하지는 않았습니다. "캐스케이드 삭제는 기본적으로 켜져 있습니다."캐스케이드 삭제는 사용자가 삭제 된 경우 디자인에 문제를 일으킬 수 있습니다. 따라서 EF는 사용자 관계에서 벗어나야합니다. 내 접근 방식은 모든 것을 끄는 것입니다. 그러나 이것이 원하는 것이 아닐 수도 있습니다. 그래서 나는 유창한 API에서 WillCacadeOnDelete (false)를 사용하여 사용자 관계에서 사용할 것이라고 언급했습니다. –

+0

Ahh .. 예, '계단식 삭제는 기본적으로 켜져 있습니다.'... 오타가 잘못되었습니다 ... 사과드립니다. 지금 문제가 있습니다 !!! 감사합니다 kirsten –