2016-07-31 40 views
1

Ich habe zwei Tabellen:Erstellen komplexer Json asp.net mit Entity Framework C#

Produkte

ProductId | ProductName 
__________|____________ 
     1 | iPhone5 
     2 | iPhone6 
     3 | iPhone6s 

Bilder

Id | ImagePath  | ProductId 
___|__________________|___________ 
1 | /images/231.jpg | 2 
2 | /images/432.jpg | 2 
3 | /images/111.jpg | 1 

möchte ich Json wie

{ 
    "id":"2", 
    "ProductName":"iPhone6" 
}, 
"Images":[ 
    { 
     "Id":"1", 
     "ImagePath":"/images/231.jpg" 
    }, 
    { 
     "Id":"2", 
     "ImagePath":"/images/432.jpg" 
    } 
] 
sieht

Also ich möchte alle Bilder bekommen o f jedes Produkt mit Entity Framework. Ich habe versucht, kommen mit:

var ads = db.Products. 
     Join(db.Images, 
      x=>x.ProductId, 
      cm=>cm.ProductId, 
      (x ,cm) => new { 
      Ads = x, 
      Images = cm 
     }). 
     Select(d => new { 
      d.Ads.AdId, 
      d.Images.ImagePath, 
     }). 
     Where(x => x.ProductId== 2). 
     ToList(); 

Und meine Json

[ 
    { 
     "AdId":2, 
     "ImagePath":"/images/231.jpg" 
    }, 
    { 
     "AdId":2, 
     "ImagePath":"/images/432.jpg" 
    } 
] 

Mein Produkt und Bild Modelle:

public class Product{ 

    public int ProductId { get; set; } 
    public string ProductName { get; set; } 

    public virtual ICollection<Image> Images { get; set; } 
} 

public class Image{ 

    public int ImageId { get; set; } 
    public string ImagePath { get; set; } 
    public int ProductId { get; set; } 

    public virtual Product Product { get; set; } 
} 
+0

Können Sie Ihre Modelldefinition für 'Product' und' Image' zusammen mit der Modellierung der Beziehung zwischen diesen beiden Entitäten posten? Denn wenn das richtig gemacht wird, dann müssen Sie den Join nicht ausführen und müssen stattdessen einfach ein "Produkt" greifen und dieses serialisieren (möglicherweise unter Verwendung von 'Json.NET'). –

+0

aktualisiert, werfen Sie einen Blick bitte –

+0

Sie möchten vielleicht einen Gruppenbeitritt machen – Rahul

Antwort

1

Sie explizit die one-to-many Beziehung zwischen dem Product modellieren können und Image wie folgt:

public class ProductConfig : EntityTypeConfiguration<Product> 
{ 
    public ProductConfig() 
    { 
     HasMany(p => p.Images).WithRequired(i => i.Product).HasForeignKey(i => i.ProductId); 
    } 
} 

und fügen Sie diese Konfiguration in der DbContext wie folgt:

public class MyDbContext:DbContext 
{ 
    ... 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new ProductConfig());    
    } 
} 

Sobald die Beziehung richtig modelliert wird, dann können Sie verwenden:

var prod = myDbContext.Products.Find(2); 

ODER

var prod = myDbContext.Products.SingleOrDefault(p => p.ProductId == 2); 

OR

das Produkt zu bekommen und einfach serialisiert, dass Sie wie folgt vor:

var iPhone6Json = JsonConvert.SerializeObject(iPhone6, Formatting.Indented); 

Die Images assoziiert während der Serialisierung als diejenigen sind virtuelle markiert geladen wird B zu kommen. Sie müssen keine explizite Verknüpfung ausführen und ausführen. Der Schlüssel hier ist, dass Sie serialisieren müssen, bevor Sie die DbContext Instanz entsorgen, andernfalls funktioniert die Funktion des faulen Ladens möglicherweise nicht, und Sie können auf einige unerwünschte Fehler stoßen.

Sie können auch die Eigenschaft in Image als JsonIgnore markieren, um das von der Serialisierung auszuschließen und Referenzschleife zu vermeiden.

[JsonIgnore] 
public int ProductId { get; set; } 

[JsonIgnore] 
public Product Product { get; set; } 

die JSON Sie sollte dann folgt:

{ 
    "id":"2", 
    "ProductName":"iPhone6", 
    "Images":[ 
     { 
      "Id":"1", 
      "ImagePath":"/images/231.jpg" 
     }, 
     { 
      "Id":"2", 
      "ImagePath":"/images/432.jpg" 
     } 
    ] 
} 

Ich denke, dass Ihr Zweck auch dient.

Ich hoffe, es hilft.

+0

Es gibt mir einen Fehler 'Die ObjectContext-Instanz wurde entfernt und kann nicht mehr für Operationen, die eine Verbindung erfordern, verwendet werden.' Diese Funktion funktioniert, wenn ich dies festlege.Configuration.LazyLoadingEnabled = false; –

+0

@IgorLevashov Ich denke, Sie versuchen, nach der Beseitigung der 'DbContext'-Instanz zu serialisieren. Versuchen Sie vorher zu serialisieren. Ich habe meine Antwort auch mit einigen zusätzlichen Hinweisen aktualisiert, die für Sie hilfreich sein könnten. –