myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » Wie kann ich die Id bei einem Entity Framework Entity auf NULL setzen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich die Id bei einem Entity Framework Entity auf NULL setzen?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
schorge schorge ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.03.2014
Beiträge: 120
Entwicklungsumgebung: VS2015
Herkunft: Marburg


schorge ist offline

Wie kann ich die Id bei einem Entity Framework Entity auf NULL setzen?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

verwendetes Datenbanksystem: MySql

Hallo,
ich benutze das EntityFramework von MS welches mir mittels TextTemplationg T4
meine classes erstellt.

C#-Code:
MySql.Data.EntityFramework
Entity Framework 6 (EF6

Ich möchte gerne Entitäten speichern bei Abänderung von
wenigen values:

C#-Code:
using (var db = new DbContext())
                    {
                        foreach(var newMember in members)
                        {
                            var member = new Member();
                            member = this.actualMember;
                            member.name = "change values";
                            //set null not allowed for unique id long
                            //member.id = null;

                            db.MemberActivations.Add(member);
                        }

                        db.SaveChanges();
                        //only one item saved
                    }

leider kann ich die ID nicht auf NULL setzten,
wie erstelle ich nun mehrere Datensätze ohne diese
komplett neu ohne unique ID zu erstellen?
14.01.2020 11:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.365
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Bitte in die EF Doku schauen, da steht sowas beschrieben.

So darfst Du keine Werte kopieren; Du musst die Eigenschaften einzeln zuweisen, weil EF die Runtime Objekte trackt.
14.01.2020 11:30 Beiträge des Benutzers | zu Buddylist hinzufügen
WarLorD_XaN WarLorD_XaN ist männlich
myCSharp.de-Mitglied

Dabei seit: 25.10.2006
Beiträge: 96
Entwicklungsumgebung: Visual Studio
Herkunft: Austria


WarLorD_XaN ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo schorge,

in deinem Codebeispiel liegt das Problem daran, dass du nach dem Erzeugen mit new der Referenz jedoch "this.actualMember" zuweist. Somit fügst du jedes mal das gleiche Objekt hinzu.
Die EF Runtime erkennt das und speichert dann nur eines.

Wenn ich dich recht verstehe möchtest du Kopien von Objekten hinzufügen.
Das Kopieren (clonen) musst du selbst implementieren.

C#-Code:
class Member
{
    Member Clone()
    {
        return new Member
        {
            a = this.a,
            b = this.b,
            c = this.c
            //  ID hier nicht setzen
        };
    }
}

foreach(var newMember in members)
{
    var member = this.actualMember.Clone();
    member.name = "change values";
    //set null not allowed for unique id long
    //member.id = null;

    db.MemberActivations.Add(member);
}
14.01.2020 11:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.365
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Runtime Object Clone() ist alles andere als eine gute Idee beim EF.

Daher hat EF eine extra Methode für das Klonen von Values

C#-Code:
var values = db.Entry(oldEntity).CurrentValues.Clone();
var newEntity = ...
db.Entry(newEntity ).CurrentValues.SetValues(values);
newEntity.Id = 0;

oder

C#-Code:
db.Entry(newEntity).CurrentValues.SetValues(oldEntity);
newEntity.Id = 0;

Oder man verwendet AutoMapper, wenn man sich die Tipparbeit sparen will.
Kommt halt drauf an, wie tief man klonen will. Daher hab ich auf die Docs verwiesen, da ist alles beschrieben.
14.01.2020 12:38 Beiträge des Benutzers | zu Buddylist hinzufügen
schorge schorge ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.03.2014
Beiträge: 120
Entwicklungsumgebung: VS2015
Herkunft: Marburg

Themenstarter Thema begonnen von schorge

schorge ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Habe eine DbExtension, aber ID ist immernoch null

C#-Code:
//-----------------

foreach(var newMember in members)
{
    var member = this.actualMember.Clone();
    member.name = "change values";
    //set null not allowed for unique id long
    //member.id = null;

    db.MemberActivations.Set<members>().AddAndSetIdToNull(newmember, x => x.id);
}

db.MemberActivations.SaveChanges();

//-----------------

public static class DbSetExtensions
    {

        public static T AddAndSetIdToNull<T>(this DbSet<T> dbSet, T entity, Expression<Func<T, object>> predicate = null) where T : class, new()
        {
            var newEntitei = (T)Activator.CreateInstance(entity.GetType());


            foreach (var property in entity.GetType().GetProperties())
            {
                PropertyInfo propertyS = newEntitei.GetType().GetProperty(property.Name);
                var value = property.GetValue(entity, null);


                var operType = ((UnaryExpression)predicate.Body).Operand;
                var memberName = ((MemberExpression)operType).Member;

                if (memberName != propertyS)
                {
                    propertyS.SetValue(newEntitei, property.GetValue(entity, null), null);
                }

            }

            //id is 0 :(
            bool exists = false;
            return !exists ? dbSet.Add(newEntitei) : null;
        }
    }

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von schorge am 14.01.2020 13:08.

14.01.2020 13:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.365
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Und warum die Bastelei, wenn das schon eingebaut ist?

Schreibst da nen Haufen Reflection-Code (oder kopiert ;-) mit anfälligen Methoden wie Runtime-Clone, dabei ist das mit eingebauten Funktionen sauber in 2-3 Zeilen zu machen. verwundert

PS: null ist nicht der Indikator für einen nicht gesetzten Key bei long; sondern 0.
14.01.2020 13:08 Beiträge des Benutzers | zu Buddylist hinzufügen
schorge schorge ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.03.2014
Beiträge: 120
Entwicklungsumgebung: VS2015
Herkunft: Marburg

Themenstarter Thema begonnen von schorge

schorge ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@abt Danke, dann vergessen wir den Code mal schnell großes Grinsen
14.01.2020 14:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 28.01.2020 06:11