Rene Vucko Rene Vucko - 1 month ago 11
C# Question

Entity Framework c#

This is my class

Igra
, it has the basic attributes.

public class Igra
{
public int IgraId { get; set; }
public string imeIgre { get; set; }

public string zvrstIgre { get; set; }

public virtual List<Prodajalna> Prodajalna { get; set; }
}


This is my class
Prodajalna
, it also has the basic attributes.

public class Prodajalna
{
public int ProdajalnaId { get; set; }
public string imeProdajalne { get; set; }

public string naslovProdajalne { get; set; }

public int IgraId;
public virtual Igra igra{get;set;
}


They are both setup via ASMX service. Now when I do this in my Entity Framework context:

Igra i1 = new Igra() { imeIgre = "WoW", zvrstIgre = "MMORPG",
Prodajalna = new List<Prodajalna>()
};
Igra i2 = new Igra() { imeIgre = "LoL", zvrstIgre = "MOBA",
Prodajalna = new List<Prodajalna>() };
Igra i3 = new Igra() { imeIgre = "Diablo", zvrstIgre = "heh",
Prodajalna = new List<Prodajalna>() };

i1.Prodajalna.Add(new Prodajalna() { imeProdajalne = "Bolha",
naslovProdajalne = "Maribor" });
i1.Prodajalna.Add(new Prodajalna() { imeProdajalne = "Nekaj",
naslovProdajalne = "Ljubljana" });

i2.Prodajalna.Add(new Prodajalna() { imeProdajalne = "Nekaj2",
naslovProdajalne = "Koper" });

i3.Prodajalna.Add(new Prodajalna() { imeProdajalne = "Nekaj2",
naslovProdajalne = "Maribor" });
i3.Prodajalna.Add(new Prodajalna() { imeProdajalne = "Nekaj",
naslovProdajalne = "Ljubljana" });
i3.Prodajalna.Add(new Prodajalna() { imeProdajalne = "Nekaj2",
naslovProdajalne = "Koper" });


So here I just added some games and stores, no big deal. Now after I run this function:

List<Prodajalna> vse_prodajalne = gameshop.izpisi_vse_prodajalne();

foreach (Prodajalna p in vse_prodajalne)
Console.WriteLine(p.imeProdajalne);


It's going to write out all the shops, so the program will write:

Bolha
Nekaj
Nekaj2
Nekaj
Nekaj2


The problem is that it should only write out:

Bolha
Nekaj
Nekaj2


so it's redundant in my database.

UPDATE 1/1
I have updated my code but it still doesn't work

public class ProdajalnaVsebujeIgroContext : DbContext
{
public DbSet<Igra> Igre { get; set; }
public DbSet<Prodajalna> Prodajalne { get; set; }

public ProdajalnaVsebujeIgroContext()//help
{
Database.SetInitializer<ProdajalnaVsebujeIgroContext>(new PVIInit());
this.Configuration.ProxyCreationEnabled = false;
this.Configuration.LazyLoadingEnabled = false;
}


public class PVIInit : DropCreateDatabaseAlways<ProdajalnaVsebujeIgroContext>
{
protected override void Seed(ProdajalnaVsebujeIgroContext context)
{

var p = new Prodajalna() { imeProdajalne = "Nekaj2", naslovProdajalne = "Koper" };
ProdajalnaVsebujeIgroContext.
context.SaveChanges();
context.Prodajalne.Add(p);


Igra i1 = new Igra() { imeIgre = "WoW", zvrstIgre = "MMORPG", Prodajalna = new List<Prodajalna>() };
Igra i2 = new Igra() { imeIgre = "LoL", zvrstIgre = "MOBA", Prodajalna = new List<Prodajalna>() };
Igra i3 = new Igra() { imeIgre = "Diablo", zvrstIgre = "heh", Prodajalna = new List<Prodajalna>() };

i1.Prodajalna.Add(new Prodajalna() { imeProdajalne = "Bolha", naslovProdajalne = "Maribor" });
i1.Prodajalna.Add(new Prodajalna() { imeProdajalne = p.imeProdajalne, naslovProdajalne = "Ljubljana" });

i2.Prodajalna.Add(new Prodajalna() { imeProdajalne = p.imeProdajalne, naslovProdajalne = "Koper" });

i3.Prodajalna.Add(new Prodajalna() { imeProdajalne = p.imeProdajalne, naslovProdajalne = "Maribor" });
i3.Prodajalna.Add(new Prodajalna() { imeProdajalne = "Nekaj", naslovProdajalne = "Ljubljana" });

i3.Prodajalna.Add(new Prodajalna() { imeProdajalne = p.imeProdajalne, naslovProdajalne = "Koper" });

context.Igre.Add(i1);
context.Igre.Add(i2);
context.Igre.Add(i3);
base.Seed(context);

Answer

The issue is with these 2 lines:

i2.Prodajalna.Add(new Prodajalna() { imeProdajalne = "Nekaj2", naslovProdajalne = "Koper" });
i3.Prodajalna.Add(new Prodajalna() { imeProdajalne = "Nekaj2", naslovProdajalne = "Koper" });

What you really want is to create a single Prodajalna and reuse it. The simplest way to accomplish this is to save the object first, and the re-use it.

var p = new Prodajalna() { imeProdajalne = "Nekaj2", naslovProdajalne = "Koper" };
_dbContext.Prodajalna.Add(p);
_dbContext.Save();

i2.Prodajalna.Add(p);
i3.Prodajalna.Add(p);