Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,11 @@ public interface IRepository<T>
Task<IEnumerable<T>> GetAllAsync();

Task<T> GetByIdAsync(Guid id);

Task<Guid> AddAsync(T data);

Task<bool> UpdateAsync(T data);

Task<bool> DeleteAsync(Guid id);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using PromoCodeFactory.Core.Domain;
using PromoCodeFactory.Core.Domain.PromoCodeManagement;
using System;
using System.Collections.Generic;

Expand All @@ -14,8 +14,11 @@ public class Employee

public string Email { get; set; }

public Role Role { get; set; }
public Guid RoleId { get; set; }
public virtual Role Role { get; set; }

public int AppliedPromocodesCount { get; set; }

public virtual List<PromoCode> PromoCodes { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using PromoCodeFactory.Core.Domain;
using System;
using System.Collections.Generic;

namespace PromoCodeFactory.Core.Domain.Administration
{
Expand All @@ -9,5 +8,6 @@ public class Role
public string Name { get; set; }

public string Description { get; set; }
public virtual List<Employee> Employee { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public class Customer

public string Email { get; set; }

//TODO: Списки Preferences и Promocodes
// TODO: Списки Preferences и Promocodes
public virtual List<Preference> Preferences { get; set; }
public virtual List<PromoCode> Promocodes { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;

namespace PromoCodeFactory.Core.Domain.PromoCodeManagement
{
public class CustomerPreference
{
public Guid CustomerId { get; set; }
public virtual Customer Customer { get; set; }
public Guid PreferenceId { get; set; }
public virtual Preference Preference { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
namespace PromoCodeFactory.Core.Domain.PromoCodeManagement
using System.Collections.Generic;

namespace PromoCodeFactory.Core.Domain.PromoCodeManagement
{
public class Preference
: BaseEntity
{
public string Name { get; set; }

public virtual List<PromoCode> PromoCodes { get; set; }

public virtual List<Customer> Customers { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using System.Runtime;
using PromoCodeFactory.Core.Domain;
using System.Collections.Generic;
using PromoCodeFactory.Core.Domain.Administration;

namespace PromoCodeFactory.Core.Domain.PromoCodeManagement
Expand All @@ -18,8 +17,14 @@ public class PromoCode

public string PartnerName { get; set; }

public Employee PartnerManager { get; set; }
public Guid? PartnerManagerId { get; set; }
public virtual Employee? PartnerManager { get; set; }

public Preference Preference { get; set; }
public Guid PreferenceId { get; set; }
public virtual Preference Preference { get; set; }

//public Guid? CustomerId { get; set; }
//public virtual Customer? Customer { get; set; }
public virtual List<Customer> Customers { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public static class FakeDataFactory
Email = "[email protected]",
FirstName = "Иван",
LastName = "Сергеев",
Role = Roles.FirstOrDefault(x => x.Name == "Admin"),
RoleId = Roles.FirstOrDefault(x => x.Name == "Admin").Id,
AppliedPromocodesCount = 5
},
new Employee()
Expand All @@ -25,7 +25,7 @@ public static class FakeDataFactory
Email = "[email protected]",
FirstName = "Петр",
LastName = "Андреев",
Role = Roles.FirstOrDefault(x => x.Name == "PartnerManager"),
RoleId = Roles.FirstOrDefault(x => x.Name == "PartnerManager").Id,
AppliedPromocodesCount = 10
},
};
Expand Down Expand Up @@ -78,7 +78,13 @@ public static IEnumerable<Customer> Customers
Email = "[email protected]",
FirstName = "Иван",
LastName = "Петров",
//TODO: Добавить предзаполненный список предпочтений
// TODO: Добавить предзаполненный список предпочтений
Preferences = new List<Preference>()
{
Preferences.First(p => p.Name == "Театр"),
Preferences.First(p => p.Name == "Семья"),
Preferences.First(p => p.Name == "Дети"),
}
}
};

Expand Down
147 changes: 147 additions & 0 deletions Homeworks/EF/src/PromoCodeFactory.DataAccess/DataContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
using Castle.Core.Resource;
using Microsoft.EntityFrameworkCore;
using PromoCodeFactory.Core.Domain.Administration;
using PromoCodeFactory.Core.Domain.PromoCodeManagement;
using PromoCodeFactory.DataAccess.Data;
using System;
using System.Collections.Generic;
using System.Linq;

namespace PromoCodeFactory.DataAccess
{
public class DataContext : DbContext
{
// 4. Настроить маппинг классов Employee, Roles, Customer,Preference и PromoCode на базу данных через EF
public DbSet<Employee> Employees { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<Preference> Preferences { get; set; }
public DbSet<Customer> Customers { get; set; }
public DbSet<PromoCode> PromoCodes { get; set; }

public DataContext(DbContextOptions<DataContext> options)
: base(options) { }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 4.
// PromoCode имеет ссылку на Preference
modelBuilder.Entity<PromoCode>()
.HasOne(p => p.Preference)
.WithMany(p => p.PromoCodes)
.HasForeignKey(p => p.PreferenceId);

// Employee имеет ссылку на Role
modelBuilder.Entity<Employee>()
.HasOne(e => e.Role)
.WithMany(r => r.Employee)
.HasForeignKey(e => e.RoleId);

// Customer имеет набор Preference: Many-to-many через сущность CustomerPreference
modelBuilder.Entity<Customer>()
.HasMany(c => c.Preferences)
.WithMany(p => p.Customers)
.UsingEntity<CustomerPreference>(
j => j.HasOne(c => c.Preference)
.WithMany()
.HasForeignKey(cp => cp.PreferenceId),
j => j
.HasOne(c => c.Customer)
.WithMany()
.HasForeignKey(cp => cp.CustomerId),
j =>
{
j.HasKey(cp => new { cp.CustomerId, cp.PreferenceId });
j.ToTable("CustomerPreferences");
}
);

// Связь Customer и Promocode реализовать через One-To-Many
//modelBuilder.Entity<PromoCode>()
// .HasOne(p => p.Customer)
// .WithMany(c => c.Promocodes)
// .HasForeignKey(p => p.CustomerId)
// .OnDelete(DeleteBehavior.Cascade); // 5. при удалении также нужно удалить ранее выданные промокоды клиента


// 7.Связь Customer и Promocode реализовать через Many-To-Many
// при удалении также нужно удалить ранее выданные промокоды клиента
modelBuilder.Entity<Customer>()
.HasMany(c => c.Promocodes)
.WithMany(p => p.Customers)
.UsingEntity<Dictionary<string, object>>(
"CustomerPromoCodes",
j => j.HasOne<PromoCode>().WithMany().HasForeignKey("PromoCodeId").OnDelete(DeleteBehavior.Cascade),
j => j.HasOne<Customer>().WithMany().HasForeignKey("CustomerId").OnDelete(DeleteBehavior.Cascade),
j => j.HasKey("CustomerId", "PromoCodeId")
);

modelBuilder.Entity<PromoCode>()
.HasOne(p => p.PartnerManager)
.WithMany(c => c.PromoCodes)
.HasForeignKey(p => p.PartnerManagerId)
.OnDelete(DeleteBehavior.SetNull);

// Строковые поля должны иметь ограничения на MaxLength
modelBuilder.Entity<Role>(r =>
{
r.Property(x => x.Name).HasMaxLength(255);
r.Property(x => x.Description).HasMaxLength(1000);
});

modelBuilder.Entity<Employee>(e =>
{
e.Property(x => x.FirstName).HasMaxLength(255);
e.Property(x => x.LastName).HasMaxLength(255);
e.Property(x => x.Email).HasMaxLength(255);
});

modelBuilder.Entity<Preference>(p =>
{
p.Property(x => x.Name).HasMaxLength(255);
});

modelBuilder.Entity<Customer>(c =>
{
c.Property(x => x.FirstName).HasMaxLength(255);
c.Property(x => x.LastName).HasMaxLength(255);
c.Property(x => x.Email).HasMaxLength(255);
});

modelBuilder.Entity<PromoCode>(p =>
{
p.Property(x => x.Code).HasMaxLength(20);
p.Property(x => x.ServiceInfo).HasMaxLength(1000);
p.Property(x => x.PartnerName).HasMaxLength(255);
});

// 3. База должна удаляться и создаваться каждый раз, заполняясь тестовыми данными из FakeDataFactory.
modelBuilder.Entity<Role>().HasData(FakeDataFactory.Roles);
modelBuilder.Entity<Employee>().HasData(FakeDataFactory.Employees);
modelBuilder.Entity<Preference>().HasData(FakeDataFactory.Preferences);
modelBuilder.Entity<Customer>().HasData(FakeDataFactory.Customers
.Select(x => new Customer
{
Id = x.Id,
FirstName = x.FirstName,
LastName = x.LastName,
Email = x.Email,
Preferences = [],
}));
modelBuilder.Entity<CustomerPreference>().HasData(
FakeDataFactory.Customers
.SelectMany(c => c.Preferences, (c, p) => new CustomerPreference
{
CustomerId = c.Id,
PreferenceId = p.Id
})
);

base.OnModelCreating(modelBuilder);
}
}
}
Loading