Ich habe eine Funktion, die eine "Person" erstellt und zurückgibt. Die "Person" hat eine "Ehepartner" -Eigenschaft, die natürlich eine andere "Person" ist. Dies verursacht eine endlose Rekursion, da die "Person", die erzeugt wird, immer eine "neue" ist, wenn die Funktion aufgerufen wird. Gibt es eine Möglichkeit, die gleiche Funktion (wie unten gezeigt) zu verwenden, ohne eine Endlosschleife zu verursachen?Vermeiden Sie Zirkelverweis für Klassen
public PersonModel Load(int personID)
{
PersonModel person = new PersonModel();
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = Helpers.ConnectionDB;
SqlCommand command = new SqlCommand();
command.Connection = conn;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "LoadPerson";
command.Parameters.Add(new SqlParameter("@PersonID", personID));
conn.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
person.PersonID = int.Parse(reader["PersonID"].ToString());
person.FirstName = reader["FirstName"].ToString();
person.LastName = reader["LastName"].ToString();
person.MiddleName = reader["MiddleName"].ToString();
person.Age = reader["Age"] != DBNull.Value ? int.Parse(reader["Age"].ToString()) : (int?)null;
person.SpouseID = reader["SpouseID"] != DBNull.Value ? int.Parse(reader["SpouseID"].ToString()) : (int?)null;
if (person.SpouseID != null && person.Spouse == null)
{
person.Spouse = this.Load(person.SpouseID.Value);
}
}
conn.Close();
}
return person;
}
Es kann besser sein, ein rekursives CTE zu schreiben, um das Social-Graph zu laden, anstatt es in Anwendungscode zu tun, es wird weniger Netzwerk-Chatty sein und nur eine einzige Befehlsausführung erfordern. – Dai
In einem Fall wie diesem, in dem A B und B auf A verweist, hätte ich nur die EhepartnerID und nicht ein Person-Objekt. Wenn Sie Details zum Ehepartner erhalten möchten, erstellen Sie einen Ehepartner aus der ID. Andernfalls treten Probleme auf, wenn Sie versuchen, diese Art von Beziehung zu serialisieren. – DeanOC
Dai - Ich weiß nicht, worauf Sie sich beziehen. Schlägst du vor, dass ich den Ehepartner (wenn es einen gibt) innerhalb des Sprocs selbst lade und dann dieses Objekt von der sekundären Tabelle, die ich zurückgebe, erstelle? Ich hatte gehofft, das zu vermeiden, da ich eine ähnliche Funktion haben würde, die ALLE "Personen" zurückgibt (im Gegensatz zu nur einer bestimmten). –