Я строю систему бронирования.У меня есть пользователи в ролях («администратор», «клиент», «работник», «студент»).
Каждое резервирование должно быть связано с пользователем клиента роли, оно может быть назначено пользователю сотрудника роли, а также может быть назначено пользователю студента роли.
Так в моем классе бронирования Iимеют свойства типа 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](https://i.stack.imgur.com/VaNhq.jpg)
Теперь у меня есть несколько проблем: 1. Когда я перечисляю всех пользователей ролевых клиентов, их свойство резервирования всегда показывает 0, даже если их резервирование доступно в базе данных.2. Если я пытаюсь удалить пользователя роли клиента, который имеет резервирование в базе данных, я получаю следующую ошибку:
Оператор DELETE конфликтует с ограничением REFERENCE "Reservation_Client".Конфликт произошел в базе данных «CRSDB», таблице «dbo.Reservations», столбце «ClientId».Оператор был прерван.
Я проверил реализации в ERD и модели edmx, к ним не применено каскадное удаление.Как я могу дать команду EF удалить все резервирования при удалении пользователя роли клиента, но не для пользователей роли сотрудника или студента.