using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Web; using EnVisage.Models; namespace EnVisage.Code.BLL { public class ClientManager : ManagerBase { public ClientManager(EnVisageEntities dbContext) : base(dbContext) { } protected override Client InitInstance() { return new Client { Id = Guid.NewGuid() }; } protected override Client RetrieveReadOnlyById(Guid key) { return DataTable.AsNoTracking().FirstOrDefault(t => t.Id == key); } public override DbSet DataTable { get { return DbContext.Clients; } } public ClientModel LoadWithChildCollections(Guid? value, bool isReadOnly = true) { ClientModel result = (ClientModel)base.Load(value, isReadOnly); if(value.HasValue) { var companies=DbContext.Company2Client.Where(x => x.ClientId == value.Value).ToList(); result.CompanyId = companies.Select(x => x.CompanyId).ToList(); result.Company = companies.Select(x => x.Company.Name).ToList(); } return result; } public override Client Save(ClientModel model) { Client client = null; if (Guid.Empty.Equals(model.Id)) { client = base.Save(model); if (model.CompanyId != null) { foreach (var companyId in model.CompanyId) { var company2Client = DbContext.Company2Client.Create(); company2Client.Id = Guid.NewGuid(); company2Client.ClientId = client.Id; company2Client.CompanyId = companyId; DbContext.Company2Client.Add(company2Client); } } } else { client = base.Save(model); var currentCompany2Clients = DbContext.Company2Client.Where(x => x.ClientId == model.Id).ToList(); currentCompany2Clients.Where(x => model.CompanyId == null || !model.CompanyId.Contains(x.CompanyId)).ToList(). ForEach(x => DbContext.Entry(x).State = EntityState.Deleted); if (model.CompanyId != null) { foreach (var companyId in model.CompanyId.Where(c => currentCompany2Clients.All(x => x.CompanyId != c))) { var company2Client = DbContext.Company2Client.Create(); company2Client.Id = Guid.NewGuid(); company2Client.ClientId = client.Id; company2Client.CompanyId = companyId; DbContext.Company2Client.Add(company2Client); } } } return client; } } }