2016-04-12 15 views
-1

Nesnelerimi eklediğimde, bire-çok olduklarını ve yabancı anahtarın birçok yan tabloya doğru şekilde yerleştirildiğini fark ederler. Nesnelerimi aldığımda, bir taraftaki tabloyu bire çok tanımazlar, böylece çok sayıda yan nesnenin ICollection'a erişemiyorum. Özellikle toplama/Entity Framework 6 Verileri alırken One-To-Many ilişkisini tanıma

'a erişmeye çalışırken boş bir Nüslülüğün İstisnası atlanır. Aşağıdaki açıklamada, Olay bir yandadır ve Rahatsızlık birçok taraftır. Bir Olay birçok Rahatsızlık ile ilişkilidir, ancak bir Rahatsızlık yalnızca bir Olayın bir parçasıdır.

Yasal Uyarı: Bazı proje kısıtlamaları ve diğer modüllerin üzerine inşa edilen bazı modüller nedeniyle DAL'de Varlık Çerçevesini kullanıyoruz ve modelleri İş/Verileri kesiştiriyoruz. Bu konuya girebilir. Bunun ideal olmadığının farkındayım, ama burada olduğumuz yer ve EF'yi böyle kullanamayacağınızı açıkça belirten bir şey görmedim.

public class Incident 
{ 
    public Incident() 
    { 

    } 

    public Incident(List<Disturbance> sortedDisturbances) 
    { 
     StartTime = sortedDisturbances[0].StartTime; 
     Disturbances = new List<Disturbance>(sortedDisturbances); 
    } 

    [Key] 
    public int IncidentID { get; set; } 

    public virtual ICollection<Disturbance> Disturbances { get; set; } 

    [Column(TypeName="datetime2")] 
    public DateTime? StartTime { get; set; } 
} 

Ben bazı alanlarda bir parametresiz yapıcı kullanmaya çalışıyor İdare Framework kaynaklanan hataları ile uğraşmak parametresiz yapıcı eklemek zorunda:

böyle tanımlanan bir Olayı var. Öyle ben yaptım Entity Framework şey kıracak bir arabirim uygulayan adı geçen herhangi bir şey okumadım

public class Disturbance : IComparable<Disturbance> 
{ 
    [Key] 
    public int DisturbanceID { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime StartTime { get; set; } 

    [Column(TypeName = "datetime2")] 
    public DateTime EndTime { get; set; } 

    public int CompareTo(Disturbance other) 
    { 
     if (this.StartTime < other.StartTime) 
      return 1; 
     if (this.StartTime > other.StartTime) 
      return -1; 
     return 0; 
    } 
} 

:

böyle tanımlanan bir Parazit var.

Bu

Bir Olayı Daha eklemek nasıl:

İş Katman:

private void MakeIncident(List<Disturbance> DisturbancesToAggregate) 
{ 
    Incident incidentToInsert = new Incident(DisturbancesToAggregate); 
    _iDAL.InsertIncident(incidentToInsert); 
} 

Veri Katmanı:

public void InsertIncident(Incident incidentToInsert) 
{ 
    using (var context = new InternalContext()) 
    { 
     context.Incident.Add(incidentToInsert);               
     context.SaveChanges(); 
    } 
} 

sorun olduğunu benim Olaylarını erişirken:

public IEnumerable<DomainModel.Disturbance> GetProcessedDisturbances() 
{ 
    List<DomainModel.Disturbance> processedDisturbances = new List<DomainModel.Disturbance>(); 
    using(var context = new InternalContext()) 
    { 
     foreach(var i in context.Incident) 
     { 
      foreach(var d in i.Disturbances) 
      { 
       processedDisturbances.Add(d); 
      } 
     } 
    } 
    return processedDisturbances; 
} 

Th e i.Disturbances Koleksiyonu bir Boş Referans Özel Durumuna neden olur. Rahatsızlıkları almak için bağlamı zorlamak için aramam gereken bir şey var mı? Açıkça yanlış bir şey yapıyorum?

Fikirlerim (ben bunların hiçbirini sevmiyorum ve bunlardan birini yapmak istemiyorum): 1. Açıkça Rahatsızlığı masaya IncidentID koydu 2 (emin bile bu işe olsaydı). Rahatsızlıklar için Olaylar bir ICollection ekleyerek bir arama tablosu zorlamak (onun çok-çok ilişkisi değil ve bu bir Olaydan tüm rahatsızlıkları temizlemek için beni engelleyeceğini düşünüyorum) 3. Açıkça model ilişkiyi tanımlamak yaratıldı. (Bunu yapmayı düşünmemek hoşuma gitmiyor, çünkü EF doğru bir şekilde yerleştirildiğini düşünüyorum çünkü doğru şekilde takılıyor.

+0

her zaman parametresi olmayan kurucu içinde navigasyon özelliklerini başlatılamadı hatırlayın: 'Rahatsızlıklar = new List ();' –

+0

bu http gibi Yutulan yabancı anahtar, kontrol edildiğinde bu bağlantıyı başvurmak zorunda: // www .entityframeworktutorial.net/code-first/foreignkey-dataannotations-code-in-code-first.aspx – rashfmnb

+4

Tembel yükleme açık olup olmadığını kontrol edin. Veya bağlamında var denemelisiniz.Incident.Include (e => e.Disturbances) –

cevap

1

EF'de tembel yükleme nedeniyle gerçekleşiyor. Verileri hevesle yüklememiz gerekiyor. onlar hakkında daha fazla bilgi için lütfen aşağıdaki bağlantıya bakın.

https://msdn.microsoft.com/en-in/data/jj574232.aspx

+0

Bu doğru yönde olduğunu düşünüyorum, ancak sadece .Include() kullanılabilir bir dize parametre olarak değil, bir lambda ifadesi alır. Şu anda Dahil Etme uzantısıyla ilgili daha fazla bilgi arıyorum. – SmashCode

+1

System.Data.Entity ad alanını kullanarak, yalnızca bu yöntemde tanımlandığı şekliyle kullanmayı deneyin. –

İlgili konular