Vraag Waarom EF-navigatie-eigenschappen null retourneren?


Ik heb twee modellen 1)

public class Indicator
{
    public long ID { get; set; }
    public string Name { get; set; }
    public int MaxPoint { get; set; }
    public string Comment { get; set; }
    public DateTime DateChanged { get; set; }
    public DateTime DateCreated { get; set; }

    public virtual IList<CalculationType> CalculationTypes { get; set; }
    public virtual IList<TestEntity> TestEntitys { get; set; }
    public virtual IndicatorGroup IndicatorGroup { get; set; }
}

2)

public class CalculationType
{
    public long ID { get; set; }
    public string UnitName { get; set; }
    public int Point { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateChanged { get; set; }

    public virtual Indicator Indicator { get; set; }
    public virtual IList<Сalculation> Calculations { get; set; }
}

Ik voer deze code uit

var indicator = DataContext.Indicators.FirstOrDefault(i => i.ID == indicatorID);
var test = DataContext.CalculationTypes.FirstOrDefault();

eerste regel return null op navigatie-eigenschap CalculationTypes enter image description here

Tweede regel retourneert lege verzameling.enter image description here Waarom?

BIJWERKEN snapshot-database enter image description hereenter image description here project link https://github.com/wkololo4ever/Stankin

toegevoegde berekening

    public class Сalculation
{
    public long ID { get; set; }

    public virtual CalculationType CalculationType { get; set; }
    public virtual ApplicationUser Creator { get; set; }
}

10
2018-03-26 06:49


oorsprong


antwoorden:


Probeer dit:

DbContext.Configuration.ProxyCreationEnabled = true;    
DbContext.Configuration.LazyLoadingEnabled = true;  

Als DbContext.Configuration.ProxyCreationEnabled is ingesteld op false, laadt DbContext geen onderliggende objecten voor een bovenliggend object tenzij de methode Include wordt genoemd op het bovenliggende object. Het instellen van DbContext.Configuration.LazyLoadingEnabled op true of false heeft geen invloed op zijn gedrag.

Als DbContext.Configuration.ProxyCreationEnabled is ingesteld op true, worden onderliggende objecten automatisch geladen en de DbContext.Configuration.LazyLoadingEnabled-waarde bepaalt wanneer onderliggende objecten worden geladen.

Ik denk dat dit een probleem is:

Bewerken: 3) Weet u zeker dat er gegevens in uw database zijn en dat de   foreign key from Indicator to IndicatorGroup heeft daar een waarde voor   specifiek record? Ik zeg dit omdat de waarde "null" geldig is als   er zijn gewoon geen gegevens.

Postscriptum Als u geen externe sleutel op Indicator ziet genoemd   "IndicatorGroupId", er kan een "IndicatorId" in de tabel zijn   "IndicatorGroup", in welk geval - uitgaande van de door u opgegeven namen -   uw database is verkeerd geconfigureerd en u zult vloeiende syntaxis moeten gebruiken   of gegevensattributen om EF te instrueren over het maken van de externe sleutels.

Probeer dit en zorg ervoor dat de buitenlandse sleutel is gecorrigeerd.

public class CalculationType
{
    public long ID { get; set; }
    public string UnitName { get; set; }
    public int Point { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateChanged { get; set; }
    [ForeignKey("IndicatorID")]
    public string IndicatorId { get; set; } //this is the foreign key, i saw in your database is: Indicator_ID, avoid this, rename it to IndicatorID or IndicatorId

    public virtual Indicator Indicator { get; set; }
    public virtual IList<Сalculation> Calculations { get; set; }
}

4
2018-03-26 07:18



1) Is Lazy Loading ingeschakeld? Als dit niet het geval is, moet u uw navigatie-eigenschappen expliciet laden met de syntaxis '. Include'.

2) Weet je zeker dat EF die relatie zou kunnen detecteren? Heeft u eerst Code First of Database gebruikt?

Bewerken: 3) Weet u zeker dat er gegevens in uw database zijn en dat de externe sleutel van Indicator naar IndicatorGroup een waarde heeft voor die specifieke record? Ik zeg dit omdat de waarde "null" geldig is als er eenvoudig geen gegevens zijn.

Postscriptum Als u geen externe sleutel op Indicator ziet met de naam "IndicatorGroupId", is er mogelijk een "IndicatorId" in de tabel "IndicatorGroup", in welk geval - uitgaande van de door u opgegeven namen - uw database verkeerd is geconfigureerd en u zult moeten gebruiken vloeiende syntaxis of gegevensattributen om EF te instrueren over het maken van de externe sleutels.


2
2018-03-26 07:06



Bekijk dit: Navigatie Eigendom met code eerst . Er wordt vermeld waarom de navigatie-eigenschap null is en de oplossingen ervan.

Standaard zijn de navigatie-eigenschappen null, ze worden niet geladen door   standaard. Voor het laden van de navigatie-eigenschap gebruiken we de methode "include" van   IQuearable en dit type laden wordt Eager loading genoemd.

Eager laden: het is een proces waarbij een zoekopdracht wordt uitgevoerd voor één type entiteit   laadt de gerelateerde entiteiten als een deel van de query en wordt bereikt door   "Include" methode van IQueryable.


2
2018-01-08 02:33



Zelfde gedrag, maar andere hoofdoorzaak dan het geselecteerde antwoord:

Navigatie-eigenschap kan ook null zijn als u uitgeschakeld bent myContext.Configuration.AutoDetectChangesEnabled

Heel voor de hand liggend, maar dit kreeg ik toen ik een aantal uitvoeringsverbeteringen uitvoerde.


1
2017-09-13 01:00