Laden...

Problem mit LINQ und ASP.NET

Erstellt von Neili vor 15 Jahren Letzter Beitrag vor 15 Jahren 6.134 Views
N
Neili Themenstarter:in
21 Beiträge seit 2008
vor 15 Jahren
Problem mit LINQ und ASP.NET

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

R
119 Beiträge seit 2008
vor 15 Jahren

Ä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

N
Neili Themenstarter:in
21 Beiträge seit 2008
vor 15 Jahren
?

Wurde geprüft alles in ordnung.

Wie muss der DataContext in HttpContext.Current.Items abglegt werden?

Ist das der Fehler?

mfg

Neili

4.207 Beiträge seit 2003
vor 15 Jahren

IMHO gar nicht.

Den DataContext solltest Du nach dem Roundtrip neu erzeugen.

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

J
537 Beiträge seit 2007
vor 15 Jahren

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.

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen

Ich kann Jürgen vollstens zustimmen.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

4.207 Beiträge seit 2003
vor 15 Jahren

Evtl kann die Attach-Methode des DataContexts hierbei noch hilfreich sein ...

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

N
Neili Themenstarter:in
21 Beiträge seit 2008
vor 15 Jahren
hm

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

N
Neili Themenstarter:in
21 Beiträge seit 2008
vor 15 Jahren
Problem

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, Dictionary2 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

B
200 Beiträge seit 2006
vor 15 Jahren

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

N
Neili Themenstarter:in
21 Beiträge seit 2008
vor 15 Jahren
Add

Hallo Leute!

Es has konkret nichts mit dem Updaten zu tun es funktioniert auch kein Insert!

lg
Andi

mfg

Neili