0% ont trouvé ce document utile (0 vote)
27 vues13 pages

Dot Net

Transféré par

Firas Abdallah
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
27 vues13 pages

Dot Net

Transféré par

Firas Abdallah
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Entity Framwork :

Dans cette partie on vas créer les classes nécessaire et faire les relation entre les classe comme many
to many et many to one et finalement la creation des base de donné :

1) How to create a data base in .net…


Dans le AM infrastructure :

1) Accéder a AMcontext
Change nom du base de donné :

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)


{
optionsBuilder.UseSqlServer(@"Data Source=(localdb)\mssqllocaldb;
Initial Catalog=Nom_a_changé;Integrated
Security=true;MultipleActiveResultSets=true");
optionsBuilder.UseLazyLoadingProxies();
base.OnConfiguring(optionsBuilder);
}

Dans le console maintenant : Affichage > autre fenêtre > console de gestion des package

2) Changé les colonne :


public DbSet<Plane> Planes { get; set; } //

// on doit changé le nom Plane du classe et Planes qui est le nom de la colonne
3) Change projet par default
4) add-migration test (test est le nom du base a créer )
5) update-database

2) les classe
Dans la phase de création des classes on doit accéder le dossier Domain :

Créer les classes nécessaires : Noté bien ces remarques :

Pour ajouter un attribut :


public DateTime FlightDate { get; set; } // DateTime est type att

Relation One to many :

Ici on a attribué une relation one to many entre flight et plane

Dans flight qui est le many (*) on ajoute le fk de plane comme suite :
public virtual Plane Plane { get; set; }

[ForeignKey("Plane")]

public int PlaneFk { get; set; }

Dans plane maintenant qui est (1) dans la multiplicité on ajoute cette
collection :

public virtual ICollection<Flight> Flights { get; set;}

Relation many to many :

mil chirtine naamlou nafs il faza :

public virtual Plane Plane { get; set; } ## toujours tithattt

[ForeignKey("Plane")] ## tithat ki ykolik aaml foreign key

public int PlaneFk { get; set; }

Héritage :
Ici on a créé une class fils staff du passanger

public class Staff:Passenger


{
public string Function { get; set; }
public DateTime EmployementDate { get; set; }
[DataType(DataType.Currency)]
public float Salary { get; set; }

public override void PassengerType()


{
base.PassengerType();
Console.WriteLine(" I am a staff member");
}

Les associations au niveau du diagramme de class :


public class Ticket
{
public double Prix { get; set; }
public string Siege { get; set; }
public Boolean VIP { get; set; }
public virtual Passenger Passenger { get; set; }
[ForeignKey("Passenger")]
public string PassengerFK { get; set; }
public virtual Flight Flight { get; set; }
[ForeignKey("Flight")]
public int FlightFK { get; set; }

De plus on ajoute des collections dans les deux class flight et passenger comme
suit :

public virtual ICollection< Ticket > Ticket { get; set; }

et au niveau de examainContext on ajoute ce code dans la fonction on model


creation :

//Configurer la clé primaire de la table porteuse


modelBuilder.Entity<Ticket>().HasKey(r => new { r.PassengerFK, r.FlightFK,
r.Siege });

Définir le type détenu Zone qui regroupe les propriétés Ville et


Pays de la classe
On créer une classe nommé zone dans la quelle il y’as les attribut necessaire

Puit on l’appel dans la classe mere ou les modification sont faite avec le type
zone (zone est varie c’est just le nom de la classe créer)

Finalement dans ExamainContext on ajoute ce code la :

//Configurer le type détenu


modelBuilder.Entity<Activite>().OwnsOne(a => a.Zone);

En utilisant les configurations FluentAPI :


Configurer la relation 1..* entre Client et Conseiller en
précisant ConseillerFK comme clé étrangère et en activant la
Cascade On Delete.
on utilisant le meme principe que les relation normale mais dans fluentAPI on
n’ecrit pas :

[ForeignKey("Passenger")]

Voici un exemple de Client qui est le manny ici (*) :


public virtual Conseiller Conseiller { get; set; }
// [ForeignKey("Conseiller")] → c’est une commentaire pour voire la diff
public int ConseillerFk { get; set;}

on suite dans Examaincontext on ajoute ce code :

//Configurer la relation 1-*


modelBuilder.Entity<Conseiller>().HasMany(cons => cons.Clients)
.WithOne(cl => cl.Conseiller)
.HasForeignKey(cl => cl.ConseillerFk)
.OnDelete(DeleteBehavior.Cascade); → c’est pour activer cascade

Voici une capture d’écran pour ce question et le question précidant de type


détenu:

Configurer la relation *..*

//Configurer la relation many-to - many entre la classe seminaire et la classe


participant

➔ ici Inscription est l’association entre les deux entity participant et


seminaire

modelBuilder.Entity<Inscription>() .HasOne(t => t.seminaire) .WithMany()


.HasForeignKey("SeminaireFK");

modelBuilder.Entity<Inscription>() .HasOne(t => t.participant) .WithMany()


.HasForeignKey("ParticipantFK");

Mapper toutes les propriétés de type String dans des colonnes de


longueur maximale de 15 caractères :

Au niveau du ExamContext on vas ajouter une fonction ConfigureConventions :

protected override void ConfigureConventions(ModelConfigurationBuilder


configurationBuilder)
{
configurationBuilder.Properties<string>().HaveMaxLength(15);

base.ConfigureConventions(configurationBuilder);
}
On peut ajouter des contrôle des saisies :

Spécifie la clé primaire

[Key]

Foreignkey
[ForeignKey("Plane")] public int PlaneFk { get; set; }

controle de saise min max


[MinLength(3, ErrorMessage = "minimum 3 caractères")] ## spécifie q’une longeur
minimale

[StringLength(7)] ##spécifie une valeur maximal max == 7

[StringLength(3, MinimumLength = 1)]


## spécifie une val minimal et maximal en meme temps max 3 et min 1

Ajouter un labelle

[Display(Name ="Date of birth")]

### lors de l’affichage de la date une labelle s’affiche ‘date of birth’

Préciser le type date


[DataType(DataType.Date)]

Préciser le type Password


[DataType(DataType.Password)]

Ecrire que des entier entre 0 et 9

[RegularExpression("^[0-9]{8}$")]
## explication
• ^ : Indique le début de la chaîne.
• [0-9] : Représente un chiffre. Cette partie signifie que le caractère à cet
emplacement doit être un chiffre compris entre 0 et 9.
• {8} : Indique que le motif [0-9] précédent doit se produire exactement 8
fois. En d'autres termes, la chaîne doit avoir une longueur de 8 chiffres.
• $ : Indique la fin de la chaîne.

Contraint range

[Range(0,int.MaxValue)] ## ➔ indique la valeur doit etres positive

[Range(18, 99, ErrorMessage = "L'âge doit être compris entre 18 et 99.")]


7aja fiha 3oumla
[DataType(DataType.Currency)]

////////// autre contraintes //////////

Haja Obligatoire

[Required(ErrorMessage ="login obligatoire")]

[Required] :
Utilisé pour spécifier que la propriété ne peut pas avoir la valeur null.

[EmailAddress] :
Utilisé pour valider que la propriété contient une adresse e-mail valide.

Seuls les caractères alphanumériques sont autorisés


[RegularExpression(@"^[A-Za-z0-9]+$", ErrorMessage = "Seuls les caractères
alphanumériques sont autorisés.")]

Les Enumérations :

On ajoute au niveau de la classe qu’on veur ajouter la ennum ce code just avant
la declaration du classe
public enum PlaneType
{
Boeing, Airbus
}
Exemple :
public enum PlaneType
{
Boeing, Airbus
}
public class Plane
{
//Property = attribut + getter + setter
public int PlaneId { get; set; }
[Range(0,int.MaxValue)]
public int Capacity { get; set; }
public DateTime ManufactureDate { get; set; }
public PlaneType PlaneType { get; set; }
public virtual ICollection<Flight> Flights { get; set; }
public override string ToString()
{
return " Capacity: "+Capacity+" Manufacture date: "+ManufactureDate;
}
}

Les Service :
Les Interface

Dans le dossier Interface on va ajouter l’interface correspondante a la classe


que nous travaillons sur :

namespace AM.ApplicationCore.Interfaces
{
public interface IFlightMethods :IService<Flight>
{
IEnumerable<DateTime> GetFlightDates(string destination);
void GetFlights(string filterType, string filterValue);
void ShowFlightDetails(Plane plane);
int ProgrammedFlightNumber(DateTime startDate);
double DurationAverage(string destination);
IEnumerable<Flight> OrderedDurationFlights();
// IEnumerable<Traveller> SeniorTravellers(Flight flight);
IEnumerable<IGrouping<string, Flight>> DestinationGroupedFlights();
}
}

Cette interface limite toute les fonction que la classe flightservice peut contenirr c’est juste une
methode pour ordonné le travaille.

Exemple d’une methode sont :

void GetFlights(string filterType, string filterValue);

void : type de retour


Getflights : nom de la fonction
string filterType, string filterValue : sont les paramètres

Les méthodes
Ici les methodes sont implementé au niveau du repertoire Service et pour
chaque interface on lui le associé une classe de service et on ajoute dans
le code :

public class ServiceClient : Service<Client>, IServiceClient


{
public ServiceClient(IUnitOfWork unitOfWork) : base(unitOfWork)
{
}
}
Ici les méthodes vont etres les fonctionnalités du travaille comme pour :

Regrouper une liste de vols (Flights) par destination et retourner une liste
de type IEnumerable:

public IEnumerable<IGrouping<string, Flight>>


DestinationGroupedFlights()
{
//var req = from f in Flights
// group f by f.Destination;
var req = Flights.GroupBy(f => f.Destination);

foreach (var g in req)


{
Console.WriteLine(g.Key);
foreach(var f in g)
Console.WriteLine("décollage: "+f.FlightDate);
}
return req;
}

Récupère les dates de vol pour une destination spécifiée à partir d'une liste
de vols (Flights).
public IEnumerable<DateTime> GetFlightDates(string destination)
{
IEnumerable<DateTime> dateTimes = new List<DateTime>();

//foreach (Flight f in Flights)


//{
// if (f.Destination == destination)
// {
// dateTimes.Add(f.FlightDate);
// Console.WriteLine(f.FlightDate);
// }
//}
//dateTimes=from f in Flights
// where f.Destination == destination
// select f.FlightDate;
//return dateTimes;
return Flights.Where(f => f.Destination == destination
.Select(f => f.FlightDate); }

Retourne les concerts où il y a des chansons d’un style musical passé en paramètre

public void GetMusicalStyle(StyleMusical st)


{
var req= GetMany(c => c.StyleMusical == st).Select(c =>
c.Artiste).SelectMany(a => a.Concerts);
foreach(var item in req)
Console.WriteLine("Date: "+item.DateConcert+"Ville:
"+item.Festival.Ville);
}
Retourner les titres des 5 chansons les plus vue sur Youtube d’un artiste passé en paramètre,
dont la date de sortie n’a pas dépassé 2 ans. (

public IEnumerable<string> GetSongsTitles(Artiste a)


{
return GetMany(c => (DateTime.Now - c.DateSortie).TotalDays < 730 &&
c.Artiste == a)
.OrderBy(c => c.VuesYoutube).Take(5).Select(c => c.Titre);

Le nbr des concert ayont une nationalité kifkif

public int NbNationnalite(Festival f, string nationnalite)


{
return
f.Concerts.Select(c=>c.Artiste).Where(a=>a.Nationalite==nationnalite).Count();
}

Retourner le plus haut cachet pendant l’année en cours pour un festival passé en paramètre. (1 pt)

public double PlusHautCachet(Festival f)


{
return f.Concerts.Where(c => c.DateConcert.Year ==
DateTime.Now.Year).Max(c => c.Cachet);

Retourner la salle la plus utilisée pendant l’année en cours :

public Salle SallePlusUtilise()


{

var sallesgrouping= GetMany(f => (DateTime.Now - f.DateFete).TotalDays <


365)
.GroupBy(f => f.Salle)
.OrderByDescending(f=>f.Count())
.FirstOrDefault();

return sallesgrouping.Key;

Retourner le nombre de fête d’un type donné, organisés dans une salle donnée. (1.5pt)

public int NbreFete(TypeFete feteType, Salle salle)


{
return GetMany(f => f.Type == feteType && f.SalleId ==
salle.IdSalle).Count();
}
Retourner la plus longue durée d’une fête de type “Anniversaire”. (1 pt)

public Salle SallePlusUtilise()


{

var sallesgrouping= GetMany(f => (DateTime.Now - f.DateFete).TotalDays < 365)


.GroupBy(f => f.Salle)
.OrderByDescending(f=>f.Count())
.FirstOrDefault();

return sallesgrouping.Key;

Web
Pour commancer il faut créer un controller
Ensuite ajouter dans le controller créer :

IClient sc;

public ClientController(IClient sc)


{
this.sc = sc;

}
➔ C’est l’instantiation du constructer de l’interface quon va l’utiliser
Ensuite dans programme.cs on vas ajouter

builder.Services.AddDbContext<DbContext, ExamenContext>();
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
builder.Services.AddScoped<IServiceClient, ServiceClient>();
builder.Services.AddScoped<IServiceConseiller, ServiceConseiller>();

VIEW Creation : Create


POUR CREER DES VIEW ON VAS ACCEDER AU CONTROLLEUR DANS LA FONCTION CREATE DE GET
ET AJOUTER UN AUTRE VUE ENSUITE MODIFIER CETTER FONCTION

// POST: ClientController/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Client collection,IFormFile PhotoFile) → A modifier
avec l’entité (IForm..)
{
try
{
sc.Add(collection); → A ajouter
sc.Commit(); → A ajouter
return RedirectToAction(nameof(Index));
}
catch
{
return View();
}

Maintenant tout est prêt il faut just manipuler le vue et le controlleur :

Liste Deroulante :
il faut changer dans le view create et le controlleur :
au niveau de view :create ➔

<select asp-for="ConseillerFk" asp-items="ViewBag.lsConseillers" class="form-


control" ></select>

Ensuite dans le controlleur modifier la fonction :

// GET: ClientController/Create
public ActionResult Create()
{
ViewBag.lsConseillers = new SelectList(scons.GetMany(), "ConseillerId",
"Prenom") ;
return View();
}

→ ici il faut dire que scons est une instance de conseiller


Et prenom est le champs que nous voulons l’afficher dans la liste

Liste Deroulante Statique:

➔ Ici un problem qui ce pose est que nous devons avoir les conseiller fk
c pour cela on ajouter Conseiller dans le client controller
➔ statique
➔ <div class="form-group">
➔ <label asp-for="PlaneType" class="control-label"></label>
➔ <select asp-for="PlaneType" class="form-control" asp-
items="Html.GetEnumSelectList<AM.ApplicationCore.Domain.PlaneType>()"></sel
ect>
➔ <span asp-validation-for="PlaneType" class="text-danger"></span>
➔ </div>

File Field for photos

Dans le create view on vas ajouter ce code dans l’input approprié :

<input type="file" name="PhotoFile" class="form-control" />


Dans le controller on vas ajouter ce code dans la fonction :

// POST: ClientController/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Client collection,IFormFile PhotoFile) // et ici on
ajouter IFormFile photoFile
{
try
{
//sauvegarder l'image sous uploads
if (PhotoFile != null)
{
var path = Path.Combine(Directory.GetCurrentDirectory(),
"wwwroot", "uploads", PhotoFile.FileName);
Stream stream = new FileStream(path, FileMode.Create);
PhotoFile.CopyTo(stream);
collection.Photo = PhotoFile.FileName;
} // ici ce termine le traitement de l’image

sc.Add(collection);
sc.Commit();
return RedirectToAction(nameof(Index));
}
catch
{
return View();
}
}

Et finalement dans le view on a modifier :

<form asp-action="Create" enctype="multipart/form-data"> // c’est dans le


premier balise create de view

VIEW Creation : Index


Ici on va créer le vue d’affichage

Dans controlleur on créer un vue avec cette fonction :

// GET: ClientController
public ActionResult Index()
{
return View();
}
Cocher Liste non create dans le vue RAZOR
Et dans la fonction d’Index on change le return to :

return View(sc.GetMany()); → ici sc est l’instance de client

Photo dans Index :


Dans la partie ou il’a un foreach items : on ajoute ce code :

<img src="~/uploads/@item.photo" width="50" height="50" />


Ajout d’un input de recherche :
Au niveau de l’indexe on ajoute

<form asp-action="index">
<fieldset>
<legend> Recherche</legend>
Saisir un login :
<input type="text" name="loginSearch" />
<input type="submit" value="Serach" />
</fieldset>
</form>

Et mainetenant au niveau de controlleur :

public ActionResult Index(string? loginSearch)


{
if(loginSearch==null)
return View(sc.GetMany());
else
return View(sc.GetMany(c=>c.Login.Contains(loginSearch)));

Ajouter un lien pour aller a une autre


page details:

Au niveau de index du la page mere on ajoute ce lgne de code :

<a asp-action="Details" asp-controller="Conseiller" asp-route-


id="@item.ConseillerFk">Conseiller Client</a>

Maintenant on ajoute l’autre controller et on créer un vue from dtail create.

Afficher l’indexe d’une manier sorted by an


attribute
Just modifier dans le :

// GET: ExpertiseController
public ActionResult Index()
{

return View(expertise.GetMany().OrderBy(c => c.DateExpertise));


}

Vous aimerez peut-être aussi