簡體   English   中英

實體框架中的復雜關系映射

[英]Complex relationship mappings in entity framework

我正在建立一個預訂系統。 我有角色(“ admin”,“ client”,“ employee”,“ student”)的用戶。

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

因此,在預訂類中,我具有用戶類型的屬性,並用[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模型為我動態創建了應用數據庫。 在此處輸入圖片說明

現在我遇到的幾個問題是:1.當我列出角色客戶端的所有用戶時,即使他們是數據庫中可用的保留,他們的保留屬性也始終顯示為0。 2.如果我嘗試刪除在數據庫中有保留的角色客戶端用戶,則會出現以下錯誤。

DELETE語句與REFERENCE約束“ Reservation_Client”沖突。 在數據庫“ CRSDB”的表“ dbo.Reservations”的“ ClientId”列中發生了沖突。 該語句已終止。

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

這段代碼可以解決問題

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM