Ich habe folgende Situation: User sind bei mir nur über ihre Userid identifizierbar. Zwar haben sie auch einen Usernamen, den können sie aber jederzeit ändern.
Möchte nun User A User B eine Nachricht schicken, so gibt er natürlich nur dessen Usernamen ein, dieser muss also umgewandelt werden. Werden die Nachrichten dann später angezeigt, muss auch aus der Absender-ID wieder ein Name gemacht werden. Solche Fälle habe ich an verschiedensten Stellen in meinem Projekt.
Um diese Umwandlung möglichst einfach zu gestalten, habe ich folgende Idee gehabt: Ich möchte mir eine Klasse "User" erstellen, die über 2 Eigenschaften verfügt: "UserId" und "UserName". Dabei sind die get- und set-Accessors so gestaltet, dass die "UserId" beim Abrufen ggf. über den UserName an die Id gelangt, und der UserName (falls er nicht angegeben, aber abgerufen wird) durch die Id geladen werden kann. Dadurch - so meine Idee - kann ich an jeder Stelle beide Daten einfach abrufen. Ist die Eigenschaft nicht gefüllt, wird sie über die andere Eigenschaft aus der DB geladen.
Um das zu realisieren, habe ich folgende 2 Klassen erstellt:
User-ClassCode:
public class User
{
private Guid _id;
public virtual Guid Id
{
get
{
//Logik zum eventuellen Laden der Id mit Hilfe des Namens über die DB
}
set
{
_id = value;
}
}
private string _name;
public virtual string Name
{
get
{
//Logik zum eventuellen Laden des Namens mit Hilfe der Id über die DB
}
set
{
_name = value;
}
}
}
Message-ClassCode:
public class Message
{
public virtual Guid Id { get; set; }
public virtual User sender { get; set; }
public virtual User receiver { get; set; }
public virtual string subject { get; set; }
public virtual string text { get; set; }
}
Message-MappingCode:
public class MessageMap : ClassMap<Message>, IMappedEntity
{
public MessageMap()
{
Id(x => x.Id);
Map(x => x.sender.Id);
Map(x => x.receiver.Id);
Map(x => x.subject);
Map(x => x.text);
}
}
Im Mapping der Message-Class speicher ich nur die Id des Users, da sich der Name ja eh jederzeit ändern kann.
Starte ich mein Projekt dann aber, erscheint folgende Meldung:
Tried to add property 'Id' when already added.Kommentiere ich alles was mit den receiver zu tun hat aus, und verwende meine Klasse User somit nur 1x, klappt es.
Was muss ich machen, damit ich meine selbst erstellte Klasse auch merhfach nutzen kann?
EditIch habe
Map(x => x.sender.Id); nun durch
Code:
Component(
x => x.sender,
userId =>
{
userId.Map(x => x.Id, "senderId");
}
);
ersetzt (receiver.Id ebenso), nun läuft es!