Springen naar inhoud


- - - - -
DB .NET

Ef - Laatste Item Ophalen

.NET

  • Log in a.u.b. om te beantwoorden
Er zijn 6 reacties in dit onderwerp

#1 Hypenate

Hypenate

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1228 berichten
    Laatst bezocht 26 nov 2017 14:43
Inzender

Geplaatst op 15 mei 2015 - 12:55

In plaats van alles opnieuw in te laden, wil ik gewoon het laatste item ophalen en dit in mijn observablecollection steken.

C Code:
 public static Models.Company GetLast()
{
Models.Company lastCompany;

try
{
using (var items = new csSecurityV3Entities_ConstructionData())
{
var company = (from r in items.tblCompany_Construction
select r).OrderBy(s => s.company).Last();
}
}
catch (Exception ex)
{
GlobalItems.Classes.ErrorLog.SaveChanges(ex, "CompanyDA GetLast");
}

//Onderstaand mag helaas niet :)
return (Models.Company)company;
}


Ik zou natuurlijk ook het laatste ID kunnen ophalen en het "model" bij aanvullen...

#2 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1126 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 15 mei 2015 - 13:36

Bericht bekijkenHypenate, op 15 mei 2015 - 12:55, zei:

C Code:
//Onderstaand mag helaas niet :)
return (Models.Company)company;

Wat is het type van items (en dus van company) dan wel?

#3 Hypenate

Hypenate

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1228 berichten
    Laatst bezocht 26 nov 2017 14:43
Inzender

Geplaatst op 15 mei 2015 - 13:57

In het ViewModel:

C Code:
private void Load(bool everything)
{
//Data
if (everything)
Companies = DataAccess.CompanyDA.Load(0);
else
{
var x = Companies.OrderByDescending(c => c.CompanyID);
Models.Company y = x.FirstOrDefault();

foreach (var item in DataAccess.CompanyDA.Load(y.CompanyID))
{
Companies.Add(item);
}

Companies = new ObservableCollection<Models.Company>(Companies.OrderBy(c => c.Company1));
}
}


In de DataAccess:

C Code:

public static ObservableCollection<Models.Company> Load(int currectMaxID)
{
Companies = new ObservableCollection<Models.Company>();

Cursor.Current = Cursors.WaitCursor;

try
{
using (var items = new csSecurityV3Entities_ConstructionData())
{
var companies = (from r in items.tblCompany_Construction
select r).Where(c => c.companyID > currectMaxID).OrderBy(c => c.company);

foreach (var item in companies )
{
Companies.Add(new Models.Company()
{
Company1 = item.company,
CompanyID = item.companyID
});
}
}
}
catch (Exception ex)
{
GlobalItems.Classes.ErrorLog.SaveChanges(ex, "CompanyDA Load");
}
finally
{
Cursor.Current = Cursors.Default;
}

return Companies;
}


Ik heb het zo gedaan, als er dan op een andere plek nog een firma wordt aangemaakt is hij in een tijd mee ingeladen.

#4 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1126 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 19 mei 2015 - 09:32

Bericht bekijkenHypenate, op 15 mei 2015 - 13:57, zei:

Ik heb het zo gedaan, als er dan op een andere plek nog een firma wordt aangemaakt is hij in een tijd mee ingeladen.
Als er op een andere plek een firma wordt gemaakt, dan kan je die toch gewoon toevoegen aan je observable list?
Zonder opnieuw te laden.
Als die uit een andere dbcontext komt, dan doe je toch gewoon een attach/merge?


Ik snap ook nog steeds niet waarom onderstaande niet mag.
Tenzij je Models.Company eigenlijk ook een ViewModel is, maar dan ligt de oplossing voor de hand.

Bericht bekijkenHypenate, op 15 mei 2015 - 12:55, zei:

C Code:
//Onderstaand mag helaas niet :)
return (Models.Company)company;


Of is Models.Company een andere Company dan een Company uit EF.
En waarom is dat dan?

#5 Hypenate

Hypenate

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1228 berichten
    Laatst bezocht 26 nov 2017 14:43
Inzender

Geplaatst op 25 mei 2015 - 11:14

Bericht bekijkenDirk Andries, op 19 mei 2015 - 09:32, zei:

Als er op een andere plek een firma wordt gemaakt, dan kan je die toch gewoon toevoegen aan je observable list?
Zonder opnieuw te laden.
Dan heb ik het ID niet.

Bericht bekijkenDirk Andries, op 19 mei 2015 - 09:32, zei:

Als die uit een andere dbcontext komt, dan doe je toch gewoon een attach/merge?
dbcontext? En van attach/merge heb ik nog niet gehoord.

Ik haal mijn gegevens zo binnen:

C Code:
 public static ObservableCollection Load(int currentMaxID)
{
badgeTypes = new ObservableCollection();

Cursor.Current = Cursors.WaitCursor;

try
{
using (var items = new csSecurityV3Entities_ConstructionData())
{
var badgetypes = (from r in items.tblBadgeType_Construction
select r).Where(l => l.bageTypeID > currentMaxID).OrderBy(s => s.type);

foreach (var item in badgetypes)
{
badgeTypes.Add(new Models.BadgeType()
{
Type = item.type,
BadgeTypeID = item.bageTypeID
});
}
}
}
catch (Exception ex)
{
GlobalItems.Classes.ErrorLog.SaveChanges(ex, "BadgeTypeDA Load");
}
finally
{
Cursor.Current = Cursors.Default;
}

if (badgeTypes != null)
return badgeTypes;
else
return new ObservableCollection();
}


Bericht bekijkenDirk Andries, op 19 mei 2015 - 09:32, zei:

Ik snap ook nog steeds niet waarom onderstaande niet mag.
Tenzij je Models.Company eigenlijk ook een ViewModel is, maar dan ligt de oplossing voor de hand.
Of is Models.Company een andere Company dan een Company uit EF.
En waarom is dat dan?

Juist, dit is niet dezelfde als die van EF.
Dit omdat ik de RaisePropertyChanged niet kan uitvoeren dan, EF overschijft dit steeds weer :/
Nu copy paste ik gewoon de achterliggende gegevens van het EF en dan maak ik een classe appart waar ik de properties uitschrijf, deze zien er bv zo uit:

C Code:
using System;
using System.ComponentModel;
using Common;
using GlobalItems;

namespace Construction.Models
{
public class Badge : PropertyChangeBase, IDataErrorInfo
{

private int badgeID;
private string badgeNumber;
private int badgeTypeID;
//
bool errBadgeNumber, errBadgeTypeID;

public int BadgeID
{
get { return badgeID; }
set
{
badgeID = value;
RaisePropertyChanged("BadgeID");
}
}

public string BadgeNumber
{
get { return badgeNumber; }
set
{
badgeNumber = value.Trim();
RaisePropertyChanged("BadgeNumber");
}
}

public int BadgeTypeID
{
get { return badgeTypeID; }
set
{
badgeTypeID = value;
RaisePropertyChanged("BadgeTypeID");
}
}

#region Validation
public bool errorCount;

public string Error
{
get;
private set;
}

public string this[string columnName]
{
get
{
Error = null;

switch (columnName)
{
case "BadgeNumber":
if (String.IsNullOrEmpty(this.BadgeNumber))
{
Error = "Field cannot be blank";
errBadgeNumber = true;
}
else
errBadgeNumber = false;
break;
case "BadgeTypeID":
if (this.BadgeTypeID == 0)
{
Error = "A company must be selected";
errBadgeTypeID = true;
}
else
errBadgeTypeID = false;
break;
default:
break;
}

if (!errBadgeNumber & !errBadgeTypeID)
errorCount = false;
else
errorCount = true;

return Error;
}
}

#endregion
}
}


*PropertyChangeBase is INotifyPropertyChanged met bijhorende properties. (dan moet ik deze niet steeds opnieuw maken).

#6 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1126 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 29 juni 2015 - 11:16

Bericht bekijkenHypenate, op 25 mei 2015 - 11:14, zei:

Dan heb ik het ID niet.
Dat snap ik niet.
Waarom niet? Omdat je autonummering/identity gebruikt voor het id field?
Een object dat wordt gepersisteerd door EF wordt toch automatisch geüpdatet en krijgt toch de nieuwe waarde in het id field?
Of bedoel je dat je objecten toevoegt die nog niet werden gepersisteerd? Dan heb je toch geen id nodig (want dan is dat nog null) .


Bericht bekijkenHypenate, op 25 mei 2015 - 11:14, zei:

dbcontext?

DbContext Class is de EF Code First versie van ObjectContext.

Bericht bekijkenHypenate, op 25 mei 2015 - 11:14, zei:

En van attach/merge heb ik nog niet gehoord.
DbSet(of TEntity).Attach
en
ObjectContext.Attach en ObjectContext.AttachTo
en
Attaching and Detaching Objects

Bericht bekijkenHypenate, op 25 mei 2015 - 11:14, zei:

Juist, dit is niet dezelfde als die van EF.
Je gebruikt waarschijnlijk de EF designer rommel?
Je bent beter af met EF Code First: dat is trouwens het enige gedeelte van EF dat zal overblijven vanaf versie 7.


Bericht bekijkenHypenate, op 25 mei 2015 - 11:14, zei:

Dit omdat ik de RaisePropertyChanged niet kan uitvoeren dan, EF overschijft dit steeds weer :/
Nu copy paste ik gewoon de achterliggende gegevens van het EF en dan maak ik een classe appart
Afleiden gaat niet?

#7 Hypenate

Hypenate

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1228 berichten
    Laatst bezocht 26 nov 2017 14:43
Inzender

Geplaatst op 04 juli 2015 - 16:14

Bedankt voor je feedback.
Ik heb het mij blijkbaar moeilijker gemaakt dan nodig...

C Code:
		public static void Insert(Models.Badge badge)
		{
			try
			{
				csSecurityV3Entities_ConstructionData ef = new csSecurityV3Entities_ConstructionData();
				ef.tblBadge_Construction.Add(new tblBadge_Construction()
				{
					badgeNumber = badge.BadgeNumber,
					badgeID = badge.BadgeID,
					badgeTypeID = badge.BadgeTypeID
				});
				ef.SaveChanges();

				GlobalItems.ViewModels.FeedHelper.insertFeed("Badge ", badge.BadgeNumber, GlobalItems.ViewModels.FeedHelper.types.created, true);

				//Event
				GlobalItems.Classes.GlobalVar.RaiseConstruction_BadgeAdded(null);
			}
			catch (Exception ex)
			{
				GlobalItems.Classes.ErrorLog.SaveChanges(ex, "BadgeDA Insert");
			}
		}



Je kan blijkaar bij code first, gewoon je klasse meegeven aan je dbcontext, en klaar is kees... :/





Ook met taq DB .NET, .NET voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[DB .NET] Untitled 1

Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)