Laden...

Problem mit Namen im aktuellen Kontext / Deklaration einer Variablen

Erstellt von Telefisch vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.179 Views
T
Telefisch Themenstarter:in
372 Beiträge seit 2008
vor 5 Jahren
Problem mit Namen im aktuellen Kontext / Deklaration einer Variablen

Hallo Forum,
ich habe eine Frage zur Deklaration von Variablen.
Mein Problem ist, dass ich für einen Kopiervorgang eines Datensatzes je nach Auswahl des Benutzers aus 8 verschiedene Tabellen kopieren möchte.
Da der Aufbau der Tabellen in allen Fällen identisch ist, wäre es natürlich sinnvoll immer mit der gleichen Routine zu kopieren, also diese nicht acht mal zu schreiben.

Aktueller Stand (zwei Tabellen)


if (sourceType == FUNCTIONGROUPPROPERTY) 
{
    FunctionGroupProperty sourceData = db.FunctionGroupProperties.Find(sourceId);
    if (sourceData != null)
    {
        db.FunctionGroupProperties.Add(new FunctionGroupProperty()
        {
            FunctionGroupId = destinationId,
            byUser = user,
            DataTypeId = sourceData.DataTypeId,
            Column = sourceData.Column,
            Mandatory = sourceData.Mandatory,
            Name = sourceData.Name,
            Placeholder = sourceData.Placeholder,
            ReadOnly = sourceData.ReadOnly,
            Value = sourceData.Value,
            Visible = sourceData.Visible
        });
        db.SaveChanges();
        return "Eigenschaft '" + sourceData.Name + "' erfolgreich kopiert.\n";
    }
    return "Quelldaten nicht gefunden, Kopieren fehlgeschlagen.\n";
}
else if (sourceType == FUNCTIONPROPERTY)
{
    FunctionProperty sourceData = db.FunctionProperties.Find(sourceId);
    if (sourceData != null)
    {
        db.FunctionGroupProperties.Add(new FunctionGroupProperty()
        {
            FunctionGroupId = destinationId,
            byUser = user,
            DataTypeId = sourceData.DataTypeId,
            Column = sourceData.Column,
            Mandatory = sourceData.Mandatory,
            Name = sourceData.Name,
            Placeholder = sourceData.Placeholder,
            ReadOnly = sourceData.ReadOnly,
            Value = sourceData.Value,
            Visible = sourceData.Visible
        });
        db.SaveChanges();
        return "Eigenschaft " + sourceData.Name + "' erfolgreich kopiert.\n";
    }
return "Quelldaten nicht gefunden, Kopieren fehlgeschlagen.\n";
                        }

Das sollte möglichst später so aussehen:


if (sourceType == FUNCTIONGROUPPROPERTY)
    FunctionGroupProperty sourceData = db.FunctionGroupProperties.Find(sourceId);

else if (sourceType == FUNCTIONPROPERTY)
    FunctionProperty sourceData = db.FunctionProperties.Find(sourceId);
  
if (sourceData != null)
{
    db.FunctionGroupProperties.Add(new FunctionGroupProperty()
    {
        FunctionGroupId = destinationId,
        byUser = user,
        DataTypeId = sourceData.DataTypeId,
        Column = sourceData.Column,
        Mandatory = sourceData.Mandatory,
        Name = sourceData.Name,
        Placeholder = sourceData.Placeholder,
        ReadOnly = sourceData.ReadOnly,
        Value = sourceData.Value,
        Visible = sourceData.Visible
    });
    db.SaveChanges();
    return "Eigenschaft '" + sourceData.Name + "' erfolgreich kopiert.\n";
}
return "Quelldaten nicht gefunden, Kopieren fehlgeschlagen.\n";

Gibt es eine Möglichkeit sourceData hier quasi unbekannt zu deklarieren oder welchen Weg könnte man zur Vereinfachung gehen?

Gruß Carsten

4.931 Beiträge seit 2008
vor 5 Jahren

Haben denn FunctionGroupProperty und FunctionProperty (und die anderen) eine gemeinsame Basisklasse (bzw. Schnittstelle) oder kannst du diese dann dafür erstellen?


IFunctionProperty sourceData = null;

if (sourceType == FUNCTIONGROUPPROPERTY)
    sourceData = db.FunctionGroupProperties.Find(sourceId);
else if (sourceType == FUNCTIONPROPERTY)
    sourceData = db.FunctionProperties.Find(sourceId);

if (sourceData != null)
{
   // ...
}

Als letzte Notlösung könntest du per Reflection die Daten einzeln kopieren.

T
Telefisch Themenstarter:in
372 Beiträge seit 2008
vor 5 Jahren

Die Klassen sind alle Datenmodelle in ASP.NET Entity Framework.
Da muss ich ehrlich gesagt grade passen, ob das so einfach geht, ohne die CodeFirst-Migration zu ruinieren. Sorry, da fehlt mir noch etwas Wissen zu 😦

Aber ich werde mit dem Stichwort mal auf die Suche gehen. Danke.

16.806 Beiträge seit 2008
vor 5 Jahren

Versuchst Du da gerade Generics nachzubauen...? 🤔

T
Telefisch Themenstarter:in
372 Beiträge seit 2008
vor 5 Jahren

Ich muss gestehen, dass ich keine Ahnung habe, wie generische Klassen mit meinem Problem bzw. dessen Lösung kombinierbar sind.

Die Modelle existieren ja, also will ich die ja eigentlich nicht neu erzeugen, was ich doch mit einer generischen Klasse machen würde.

Ich fürchte das ist mir noch zu hoch, aber ich lese mich dazu mal noch etwas schlau...

16.806 Beiträge seit 2008
vor 5 Jahren

Deine POCOs haben damit prinzipiell nichts zutun, ausser dass die eine Basisklasse hätte bzw. ein gemeinsames Interface.

public interface IEntity {}
public class PersonEntity : IEntity {}

public abstract class BaseRepository<TEntity> where TEntity:IEntity {}
public class PersonRepository : BaseRepository<PersonEntity> {}

wäre ein solcher Beispielaufbau.

Und durch einen geeigneten Pattern - hier evtl. der Repository Pattern, daher auch das Beispiel - könnte sich Dein Problem sehr einfach zentral lösen lassen.
Das Problem besteht daher vermutlich durch ein nicht passendes Code-Design; ganz einfaches OOP.