Situational sketch
I developed a system in which Zoekeryou can add a lot of materials (in code Matetiaal) to advertising (in code ). Relationships are many for many. Here you got the structure of my classes.
+-------------------------------------+ many to many +-------------------------------+
| Zoeker | <--------------> | Materiaal |
+------------+------------------------+ +---------+---------------------+
| ID | int | | ID | int |
| Materialen | ICollection<Materiaal> | | Zoekers | ICollection<Zoeker> |
| Titel | string | | Naam | string |
+------------+------------------------+ +---------+---------------------+
I will add new content and advertisements using the following pseudo-code:
void Insert(Zoeker zoeker, string[] materialen)
{
foreach (string m in materialen)
{
Materiaal mat = materiaalRepo.GetByName(m);
if (mat == null)
{
mat = materiaalRepo.Insert(new Materiaal(m));
}
zoeker.Materialen.Add(mat);
}
zoekerRepo.Insert(zoeker);
}
, (Zoeker), , . materialenRepo.GetByName(string) null, . , Materiaal. materialenRepo.GetByName(string) null, Materialen -property .
Entity Framework.
, :
System.InvalidOperationException: IEntityChangeTracker.
public virtual TEntity Insert(TEntity entity)
{
return dbSet.Add(entity);
}
zoekerRepo.Insert(zoeker);.
, .
public class ZoekService
{
public int InsertZoeker(Zoeker zoeker, ApplicationUser user, string materialenString)
{
return InsertZoeker(zoeker, user, materialenString.Split(','));
}
public int InsertZoeker(Zoeker zoeker, ApplicationUser user, string[] materialen)
{
zoeker.Gebruiker = user;
zoeker.Materialen = new List<Materiaal>();
using (ApplicationDbContext ctx = new ApplicationDbContext())
{
ZoekerRepository zoekerRepo = new ZoekerRepository(ctx);
MateriaalRepository materiaalRepo = new MateriaalRepository(ctx);
foreach (string m in materialen)
{
Materiaal materiaal = materiaalRepo.GetByNaam(m);
if (materiaal == null)
{
materiaal = materiaalRepo.Insert(new Materiaal(m));
}
zoeker.Materialen.Add(materiaal);
}
zoekerRepo.Insert(zoeker);
zoekerRepo.SaveChanges();
return zoeker.ID;
}
}
}
ZoekerRepository extends GenericRepository<Zoeker>
public class ZoekerRepository : GenericRepository<Zoeker>
{
public ZoekerRepository()
{ }
public ZoekerRepository(ApplicationDbContext ctx): base(ctx)
{ }
}
MateriaalRepository extends GenericRepository<Materiaal>
public class MateriaalRepository : GenericRepository<Materiaal>
{
public MateriaalRepository()
{ }
public MateriaalRepository(ApplicationDbContext ctx): base(ctx)
{ }
public Materiaal GetByNaam(string naam)
{
return (from m in dbSet
where m.Naam.Equals(naam)
select m).SingleOrDefault<Materiaal>();
}
}
GenericRepository<TEntity>
public class GenericRepo<TEntity> where TEntity : class
{
internal ApplicationDbContext context;
internal DbSet<TEntity> dbSet;
public GenericRepo()
{
context = new ApplicationDbContext();
dbSet = context.Set<TEntity>();
}
public GenericRepo(ApplicationDbContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual TEntity Insert(TEntity entity)
{
return dbSet.Add(entity);
}
public void SaveChanges()
{
try
{
context.SaveChanges();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
, , . , , GenericRepo<TEntity> ( , ). . GenericRepo<Zoeker> GenericRepo<Materiaal>.
?
IEntityChangeTracker. Entity Framework 4.1, , :
, :
EmployeeService es = new EmployeeService(context);
CityService cs = new CityService(context);
. .
, .
public class DeelController : Controller
{
private UserManager<ApplicationUser> UserManager { get; set; }
private ZoekService _zoekservice = new ZoekService();
public DeelController()
{
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(ApplicationDbContext));
}
[HttpGet]
[Authorize]
public ActionResult Nieuw()
{
return View(new Zoeker());
}
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Nieuw(Zoeker zoeker)
{
_zoekservice.InsertZoeker(zoeker, await UserManager.FindByNameAsync(User.Identity.Name), zoeker.MaterialenString);
return RedirectToAction(nameof(Index));
}
}
Zoeker extends Post
public class Zoeker: Post
{
public virtual ICollection<Materiaal> Materialen { get; set; }
public virtual ICollection<ApplicationUser> Delers { get; set; }
[NotMapped]
public string MaterialenString { get; set; }
}
Post
public class Post
{
[Key]
public int ID { get; set; }
public string Titel { get; set; }
public string Omschrijving { get; set; }
public virtual ApplicationUser Gebruiker { get; set; }
public string GebruikerID { get; set; }
public DateTime StartPeriode { get; set; }
public DateTime? Verwijderd { get; private set; }
public DateTime? Opgelost { get; private set; }
public DateTime? Belangerijk { get; private set; }
public virtual ICollection<Antwoord> Antwoorden { get; set; }
}
, :
materiaal = new Materiaal(m);
, , , .
, :

Material[0] _entityWrapper EntityWrapperWithoutRelationships<System.Data.Entity.DynamicProxies.Materiaal_E0DDEFDA63D33C75C64324662B40FDC414EC19CA4AD6BF18443B63FC60015374>. : . .
"InsertZoeker" (Zoeker
public int InsertZoeker(Zoeker zoeker, ApplicationUser user, string[] materialen)
{
Zoeker newZoeker = new Zoeker()
{
Gebruiker = user,
StartPeriode = DateTime.Now,
Materialen = new List<Materiaal>(),
Titel = zoeker.Titel,
Omschrijving = zoeker.Omschrijving
};
using (ApplicationDbContext ctx = new ApplicationDbContext())
{
ZoekerRepository zoekerRepo = new ZoekerRepository(ctx);
MateriaalRepository materiaalRepo = new MateriaalRepository(ctx);
foreach (string m in materialen)
{
Materiaal materiaal = materiaalRepo.GetMateriaalByNaam(m);
if (materiaal == null)
{
materiaal = new Materiaal(m);
}
newZoeker.Materialen.Add(materiaal);
}
zoekerRepo.Insert(newZoeker);
zoekerRepo.SaveChanges();
return zoeker.ID;
}
}
