2017-07-12 5 views
-1

ich meine Modelle Setup wie dieses ...ef Kern .INCLUDE(). Enthält() NULL-Verweis Ausnahme

public class Model1 : IEquatable<Model1> 
{ 
    public int Model1Id { get; set; } 
    public string Name1 { get; set; } 
    public Model2 Model2 { get; set; } 
    public int Model2Id { get; set; } 

    public bool Equals(Model1 other) 
    { 
     return this.Model2.Equals(other.Model2) 
      && this.Name1 == other.Name1; 
    } 
} 

public class Model2 : IEquatable<Model2> 
{ 
    public int Model2Id { get; set; } 
    public string Name2 { get; set; } 

    public bool Equals(Model2 other) 
    { 
     return this.Name2 == other.Name2; 
    } 
} 

public class ModelContext : DbContext 
{ 
    public DbSet<Model1> Model1 { get; set; } 
    public DbSet<Model2> Model2 { get; set; } 
    public ModelContext(DbContextOptions<ModelContext> options) : base(options) { } 
    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Model1>(b => 
     { 
      b.HasOne(m1 => m1.Model2).WithMany().HasForeignKey(m1 => m1.Model2Id); 
     }); 
    } 
} 

dann ich eine NULL-Verweis Ausnahme, wenn ich dies tun ...

static void Main(string[] args) 
{ 
    var myModel1 = new Model1 
    { 
     Name1 = "myName1", 
     Model2 = new Model2 
     { 
      Name2 = "myName2" 
     } 
    }; 
    var connection = new SqliteConnection("DataSource=:memory:"); 
    connection.Open(); 
    try 
    { 
     var options = new DbContextOptionsBuilder<ModelContext>() 
      .UseSqlite(connection) 
      .Options; 

     //create database 
     using(var ctx = new ModelContext(options)) 
     { 
      ctx.Database.EnsureCreated(); 
     } 

     //add model objects 
     using (var ctx = new ModelContext(options)) 
     { 
      ctx.Database.EnsureCreated(); 
      ctx.Model1.Add(myModel1); 
      ctx.SaveChanges(); 
     } 

     //check if exists 
     using(var ctx = new ModelContext(options)) 
     { 
      //exception here 
      bool isExists = ctx.Model1.Include(m1 => m1.Model2).Contains(myModel1); 
      Console.WriteLine(isExists); 
     } 
    } 
    finally 
    { 
     connection.Close(); 
    } 

    Console.ReadKey(); 
} 

ich expeting die Model2 Instanz meiner m1 gefüllt werden, wenn ich die Include nennen, aber es ist immer noch null.

aber Wenn ich AsEnumerable() zu meiner Anfrage hinzufügen wie ..

ctx.Model1.Include(m1 => m1.Model2).AsEnumerable().Contains(model1); 

dann funktioniert alles einwandfrei.

EDIT:

meine Frage ... warum muss ich AsEnumerable() aufrufen? Ich war es erwarten, ohne zu arbeiten AsEnumerable() aufrufen ..

+0

'.AsEnumerabe()' meinst du AsEnumerable() ' –

+0

siehe EDIT –

+1

Was versuchst du zu tun, das macht keinen Sinn, Möchten Sie überprüfen, ob die Liste etwas enthält oder die vollständige Liste haben soll? –

Antwort

2

Der Unterschied ist, ist ein entityframe Arbeit nennen die andere Linq ist auf Objekte Entity Framework Versteht nicht enthält, die für ein CLR-Objekt

public void AddIfNotExists(Model1 model1) 
{ 

    //No Need for the include this is executed in sql, assuming the model 2 
    //property has already been included in your model1 this should work fine 
    if(false == _context.Model1.Any(x => x.Name1 == model1.Name1 
         && x.Model2.Name2 == model1.Model2.Name2)) 
    { 
     _context.Model1.Add(model1); 
    } 
} 

Ich habe dies basierend auf Ihrer Logik gemacht, aber die Chancen sind, dass Sie wirklich nur überprüfen möchten, ob model1.id das Modell1 ist. Aber ich habe keine Ahnung, was deine Architektur macht, also ist das, was du wahrscheinlich willst

+0

Ich habe meine Frage aktualisiert, um zu zeigen, dass ich versuche, eine Methode AddIfNotExists zu erstellen. ein –

+0

@PaoloGo hat das funktioniert? Wenn ja, kannst du das als richtig markieren –

Verwandte Themen