2011-10-11 175 views
1

我正在構建預訂系統。我有角色的用戶('admin','client','employee','student')。實體框架中的複雜關係映射

每個預留必須與角色客戶端的用戶相關聯,它可能被分配給角色員工的用戶,也可能被分配給角色學生的用戶。

因此,在我的預訂類中,我具有User類型的屬性,並用[ForeignKey(「AnytypeId」)]屬性標記它們以提示EF關係。

我在http://blog.stevensanderson.com/2011/01/28/mvcscaffolding-one-to-many-relationships/

public class Reservation 
{ 

    public int ReservationID 
    { 
     get; 
     set; 
    } 

    [Required(ErrorMessage="Please provide a valid date")] 
    public DateTime ReservationDate 
    { 
     get; 
     set; 
    } 
    public DateTime ReservationEnd { get; set; } 
    public DateTime EntryDate 
    { 
     get; 
     set; 
    } 
    public DateTime UpdatedOn 
    { 
     get; 
     set; 
    } 
    public decimal Ammount 
    { 
     get; 
     set; 
    } 

    public decimal? Discount { get; set; } 

    [DataType(DataType.MultilineText)] 
    public string ServiceDetails { get; set; } 

    [DataType(DataType.MultilineText)]   
    public string Remarks { get; set; } 

    public string VoucherNumber { get; set; } 

    public int ServiceID 
    { 
     get; 
     set; 
    } 
    public Service Service 
    { 
     get; 
     set; 
    } 

    public string EmployeeId { get; set; } 
    [ForeignKey("EmployeeId")] 
    public User Employee { get; set; } 


    public string ClientId { get; set; } 
    [ForeignKey("ClientId")] 
    public User Client { get; set; } 


    public string StudentId { get; set; } 
    [ForeignKey("StudentId")] 
    public User Student { get; set; } 

} 
public class User 
{ 

    //[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    //public Guid UserId { get; set; } 

    [Key] 
    [Required(ErrorMessage = "User Name is required")] 
    [Display(Name = "User Name")] 
    [MaxLength(100)]   
    public string UserName { get; set; } 

    [Required] 
    [MaxLength(64)] 
    public byte[] PasswordHash { get; set; } 

    [Required] 
    [MaxLength(128)] 
    public byte[] PasswordSalt { get; set; } 

    [Required(ErrorMessage = "Email is required")] 
    [DataType(DataType.EmailAddress)] 
    [MaxLength(200)] 
    public string Email { get; set; } 

    [MaxLength(200)] 
    public string Comment { get; set; } 

    [Display(Name = "Approved?")] 
    public bool IsApproved { get; set; } 

    [Display(Name = "Crate Date")] 
    public DateTime DateCreated { get; set; } 

    [Display(Name = "Last Login Date")] 
    public DateTime? DateLastLogin { get; set; } 

    [Display(Name = "Last Activity Date")] 
    public DateTime? DateLastActivity { get; set; } 

    [Display(Name = "Last Password Change Date")] 
    public DateTime DateLastPasswordChange { get; set; } 

    public string address { get; set; } 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public string Phone { get; set; } 

    public bool? IsActive { get; set; } 

    public int? ClientTypeID { get; set; } 
    public virtual ClientType ClientType { get; set; } 

    public virtual ICollection<Role> Roles { get; set; } 

    public DateTime? PackageValidity { get; set; } 


    public virtual ICollection<Reservation> Reservations { get; set; } 


} 

public class UserMap : EntityTypeConfiguration<User> 
{ 
    public UserMap() 
    { 
     this.HasMany(u => u.Roles) 
     .WithMany(r => r.Users) 
     .Map(m => 
     { 
      m.ToTable("RoleMemberships"); 
      m.MapLeftKey("Username"); 
      m.MapRightKey("RoleName"); 
     }); 
    } 
} 

見過這樣的代碼,現在我運行了我MVC3 EF代碼第一個應用程序數據庫中創建上飛與以下ERD和EDMX模型。 enter image description here

現在一些問題,我有: 1.當我列出角色客戶端的所有用戶的保留屬性顯示始終爲0,即使它們是在數據庫中可用的預訂。 2.如果我試圖刪除在數據庫中預留的角色客戶端的用戶,我會收到以下錯誤消息。

DELETE語句與REFERENCE約束「Reservation_Client」衝突。衝突發生在數據庫「CRSDB」,表「dbo.Reservations」,列'ClientId'。 該聲明已被終止。

我檢查了ERD和edmx模型中的realtions,他們沒有級聯刪除應用到他們。如何指示EF在刪除角色客戶端的用戶時刪除所有保留,但不能刪除角色員工或學生的用戶。

回答

1

此代碼的伎倆

public class Reservation 
{ 

    public int ReservationID 
    { 
     get; 
     set; 
    } 

    [Required(ErrorMessage="Please provide a valid date")] 
    public DateTime ReservationDate 
    { 
     get; 
     set; 
    } 
    public DateTime ReservationEnd { get; set; } 
    public DateTime EntryDate 
    { 
     get; 
     set; 
    } 
    public DateTime UpdatedOn 
    { 
     get; 
     set; 
    } 
    public decimal Ammount 
    { 
     get; 
     set; 
    } 

    public decimal? Discount { get; set; } 

    [DataType(DataType.MultilineText)] 
    public string ServiceDetails { get; set; } 

    [DataType(DataType.MultilineText)]   
    public string Remarks { get; set; } 

    public String PaymentMethod { get; set; } 
    public string VoucherNumber { get; set; } 

    public int ServiceID 
    { 
     get; 
     set; 
    } 
    public virtual Service Service 
    { 
     get; 
     set; 
    } 


    public string EmployeeID { get; set; } 
    [ForeignKey("EmployeeID")] 
    public virtual User Employee { get; set; } 


    public string ClientID { get; set; } 
    [ForeignKey("ClientID")] 
    public virtual User Client { get; set; } 


    public string StudentID { get; set; } 
    [ForeignKey("StudentID")] 
    public virtual User Student { get; set; } 


} 

public class ReservationMap : EntityTypeConfiguration<Reservation> 
{ 
    public ReservationMap() 
    { 
     this.HasOptional(r => r.Client).WithMany().WillCascadeOnDelete(true); 
     this.HasOptional(r => r.Employee).WithMany().WillCascadeOnDelete(false); 
     this.HasOptional(r=>r.Student).WithMany().WillCascadeOnDelete(false); 
    } 
}