Hallo Leute!
Ich habe folgendes Problem:
Wird eine Seite geladen erzeuge ich ein neues Objekt meines BusinessLayers der das DataContext Objekt beinhaltet.
Komischerweise funktionieren alle Select Abfragen jedoch nicht update oder delete
Folgende Fehlermeldung kommt immer wieder zu trage:
Es wurde versucht, eine Entität anzufügen oder hinzuzufügen, die nicht neu ist und möglicherweise aus einem anderen DataContext geladen wurde. Dies wird nicht unterstützt.
Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.
Ausnahmedetails: System.NotSupportedException: Es wurde versucht, eine Entität anzufügen oder hinzuzufügen, die nicht neu ist und möglicherweise aus einem anderen DataContext geladen wurde. Dies wird nicht unterstützt.
Quellfehler:
Zeile 45: {
Zeile 46: _context.Kundes.InsertOnSubmit(k);
Zeile 47: _context.SubmitChanges();
Zeile 48: _log.Info(_currentUser.USERNAME + ": Customer " + k.NAME + " " + k.WOHNORT + " added");
Zeile 49: }
Meine Klasse sieht folgender Maßen aus:
public partial class AddDeposit : System.Web.UI.Page
{
private BusinessLayer _biLayer = new BusinessLayer();
private Versicherung _vitem = null;
private void Page_Load(object sender, System.EventArgs e)
{
if (Session["User"] == null)
{
Response.Redirect("Login.aspx?RequestUrl=AddDeposit");
}
if (!Page.IsPostBack)
{
InitializeControls();
Session["Versicherungen"] = new List<Versicherung>();
}
else
{
this.Validate();
}
}
private void SaveKunde()
{
ComboBoxItem cbi = this.ComboBoxKunde.Items.FindByText(this.ComboBoxKunde.Text);
if (cbi == null)
{
Verkaeufer currentUser=(Verkaeufer)Session["User"];
Kunde knew = new Kunde
{
NAME = this.ComboBoxKunde.Text,
WOHNORT = "Test",
Verkaeufer = currentUser
};
_biLayer.AddKunde(knew, currentUser);
ComboBoxKunde.Items.Clear();
List<Kunde> klist = _biLayer.GetKundenByCurrentUser((Verkaeufer)Session["User"]);
foreach (Kunde k in klist)
{
ComboBoxItem item = new ComboBoxItem();
item.Value = k.KUN_ID.ToString();
item.Text = k.NAME;
ComboBoxKunde.Items.Add(item);
}
}
}
}
Und bei SaveKunde tritt dann der Fehler auf
Bitte um dringende Hilfe
mfg
Neili
Ähm ich rate jetzt mal das du LINQ to SQL benutzt (es gibt noch andere LINQ Provider)
prüf mal ob deine Object/Entität Kunde Modifies und Adds erlaubt
Wurde geprüft alles in ordnung.
Wie muss der DataContext in HttpContext.Current.Items abglegt werden?
Ist das der Fehler?
mfg
Neili
IMHO gar nicht.
Den DataContext solltest Du nach dem Roundtrip neu erzeugen.
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Hallo Zusammen,
IMHO gar nicht.
Den DataContext solltest Du nach dem Roundtrip neu erzeugen. jeder Request erzeugt einen neuen HttpContext. Aus deisem Grund ist es schon möglich den DataContext im HttpContext abzulegen. Ähnlich wie hier: http://www.aspnetzone.de/blogs/juergengutsch/archive/2008/05/16/performance-tipp-connection-global-fuer-einen-page-request-definieren.aspx
Aber da es sich um eine SQL Server verbindung handelt macht es keinen Sinn (wie auch aus der Diskussion zu dem Artikel zu entnehmen ist) Der Context kann wärend des Requests auch problemlos mehrfach erzeugt werden.
Aus meiner Sicht hat die DB Verbindung eh nichts in der Webanwendung verloren und sollte in einer separaten Library gekapselt werden. Auf deise Art können DB Verbindungen ausgetauscht werden und die Anwendung wird besser Wartbar.
MfG
Jürgen
ASP.NET Zone | gutsch-online | sharpcms | .NET Stammtisch Konstanz-Kreuzlingen | See# Party
Hallo zusammen
Ich kann Jürgen vollstens zustimmen.
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Evtl kann die Attach-Methode des DataContexts hierbei noch hilfreich sein ...
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Wir haben eine eigene Schicht hierfür erstellt (BusinessLayer.cs) in der Select statements und weitere operationen festgelegt sind.
Ist es also sinnvoll in der Page Klasse einen Member (nicht statisch) zu deklarieren der jedes mal die business schicht neu initialisiert?
BusinessLayer _bi = new BusinessLayer()?
Brauche ja dann den Context nicht oder?
Ich weiß nicht warum das nicht funktioniert hat das etwas damit zu tun, dass der Context jedes mal neu erzeugt wird?
thx
mfg
Neili
Hallo Leute!
Habt ihr eine Lösung für das obig genannte Problem?
Es wurde versucht, eine Entität anzufügen oder hinzuzufügen, die nicht neu ist und möglicherweise aus einem anderen DataContext geladen wurde. Dies wird nicht unterstützt.
Dies ist die Error Meldung und am Stack Trace ist es hier aufgetreten!
" bei System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(MetaType mt, Object obj, Dictionary2 visited, Boolean recurse, Int32 level)\r\n bei System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(Object obj, Boolean recurse)\r\n bei System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(Object obj)\r\n bei System.Data.Linq.ChangeProcessor.TrackUntrackedObjects(MetaType type, Object item, Dictionary
2 visited)\r\n bei System.Data.Linq.ChangeProcessor.TrackUntrackedObjects(MetaType type, Object item, Dictionary`2 visited)\r\n bei System.Data.Linq.ChangeProcessor.TrackUntrackedObjects()\r\n bei System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)\r\n bei System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)\r\n bei System.Data.Linq.DataContext.SubmitChanges()\r\n bei SPMA.BusinessLibrary.BusinessLayer.AddKunde(Kunde k, Verkaeufer _currentUser) in E:\Projects\UniqaMIS\application\SPMA\SPMA.BusinessLibrary\BusinessLayer.cs:Zeile 45.\r\n bei SPMA.AddDepositNeu.SaveKunde() in E:\Projects\UniqaMIS\application\SPMA\SPMA\AddDepositNeu.aspx.cs:Zeile 112.\r\n bei SPMA.AddDepositNeu.ButtonSite1Next_Click(Object sender, EventArgs e) in E:\Projects\UniqaMIS\application\SPMA\SPMA\AddDepositNeu.aspx.cs:Zeile 134.\r\n bei System.EventHandler.Invoke(Object sender, EventArgs e)\r\n bei System.Web.UI.WebControls.Button.OnClick(EventArgs e)\r\n bei System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)\r\n bei System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)\r\n bei System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)\r\n bei System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)\r\n bei System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)"
Bitte um Hilfe!
mfg
Neili
Hallo,
Komischerweise funktionieren alle Select Abfragen jedoch nicht update oder delete
Du musst den Datensatz zuerst Laden, sprich:
Entry obj = db.Table.Where(ID == id).FirstOrDefault();
obj.<Property> = <Value>;
db.SubmitChanges();
So müsste das eigentlich funktionieren.
gruss
Hallo Leute!
Es has konkret nichts mit dem Updaten zu tun es funktioniert auch kein Insert!
lg
Andi
mfg
Neili