Ciao,
Adesso quando mi devo interfacciare con un database, mi creo il modello a oggetti della mia applicazione e poi faccio una classe DAL a cui passo i miei oggetti di dominio, e tramite gli oggetti di ADO.NET (SqlConnection, ecc.) faccio le query SQL a mano e leggo e scrivo i dati.
Ora sto cercando di fare un passo avanti ed utilizzare Entity Framework.
Devo modellare una cosa semplice, Alberghi (Dati dell’albergo), Tipi stanze (Doppia, Tripla, ecc. per albergo), Stanze (Numero della stanza e tipo per albergo).
Se avessi fatto il database a mano avrei fatto 3 tabelle così fatte:
-Hotels (HotelId, Name)
-HotelRoomsType (RoomTypeId, HotelId (FK), Name)
-HotelRooms (RoomId, HotelId (FK), RoomTypeId (FK))
Ho provato a fare questo modello:
[Table("Hotels")]
public partial class Hotel
{
/// <summary>Id</summary>
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
/// <summary>Nome dell'Hotel</summary>
[Required, StringLength(50)]
public string Name { get; set; }
public virtual ICollection<HotelRoomType> RoomsType { get; set; }
public virtual ICollection<HotelRoom> Rooms { get; set; }
}
/// <summary>Tipo di stanza dell'Hotel</summary>
[Table("HotelRoomsType")]
public partial class HotelRoomType
{
/// <summary>Id Tipo camera</summary>
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
/// <summary>Hotel</summary>
[ForeignKey("Hotel")]
public int HotelId { get; set; }
public virtual Hotel Hotel { get; set; }
/// <summary>Nome del tipo di stanza</summary>
[Required, StringLength(20)]
public string Name { get; set; }
public virtual ICollection<HotelRoom> Rooms { get; set; }
}
[Table("HotelRooms")]
public partial class HotelRoom
{
/// <summary>Id camera</summary>
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
/// <summary>Hotel</summary>
[ForeignKey("Hotel")]
public int HotelId { get; set; }
public virtual Hotel Hotel { get; set; }
/// <summary>Nome della camera</summary>
[Required, StringLength(20)]
public string Name { get; set; }
/// <summary>Tipo di camera dell'hotel</summary>
[Required, ForeignKey("RoomType")]
public int RoomTypeId { get; set; }
public virtual HotelRoomType RoomType { get; set; }
}
In questo modo schianta e mi da questo errore:
“
L'introduzione del vincolo FOREIGN KEY 'FK_dbo.HotelRoomsType_dbo.Hotels_HotelId' nella tabella 'HotelRoomsType' può determinare la creazione di cicli o più percorsi di propagazione. Specificare ON DELETE NO ACTION o ON UPDATE NO ACTION oppure modificare gli altri vincoli FOREIGN KEY.
“
Se dalla classe HotelRoom tolgo le proprietà HotelId e Hotel, allora funziona, cioè viene creata la tabella HotelRooms, ma con un campo Hotel_Id (anzichè HotelId come vorrei io) e che accetta NULL (condizione che io non voglio).
Adesso le domande sono:
1.Perché con le proprietà HotelId e Hotel nella classe HotelRoom schianta?
2.Per quale ragione è stata creata la proprietà Hotel_Id, e come si fa a cambiargli nome?
3.Perché la proprietà Hotel_Id, che credo la crei in qualche modo la proprietà RoomType accetta NULL nonostante sia impostata come Required?