2009-02-27 8 views
1

ich ein Problem habe: Ich habe Benutzer:nHibernate Vererbung Problem, wenn Childs Speichern

[Class(Table = "Users", Name = "User")] 
public class User 
{ 
    [Id(0, Column = "UserId", Type = "Guid", Name = "Id")] 
    [Generator(1, Class = "assigned")] 
    public Guid Id { get; set; } 

    [Property(Name = "Password", Column = "Password", Type = "String")] 
    public string Password { get; set; } 

    [Property(Name = "Email", Column = "Email", Type = "String")] 
    public string Email { get; set; } 
} 

Und eine Verteilmaschine:

[JoinedSubclass(ExtendsType = typeof(User), Table = "Distributors")] 
public class Distributor : User 
{ 

    [Id(0, Column = "DistributorId", Type = "Guid", Name = "Identifier")] 
    [Generator(1, Class = "assigned")] 
    protected Guid Identifier { get; set; } 

    [Property(Name = "Company", Column = "Company", Type = "String")] 
    public String Company { get; set; } 
} 

Jetzt muss ich Benutzer zum Verteiler fördern. Aber ich muss seine ID speichern (andere Teile des Systems benutzen es). Ich bekomme Benutzer und neue Verteiler erstellen. Aber wenn ich versuche, Verteiler zu speichern, erhalte ich diesen Fehler:

ein anderes Objekt mit dem gleichen Bezeichner-Wert war bereits mit der Sitzung verbunden: ec6f6a9f-a236-4385-835c-7f408a5f594d, der Einheit: MLMCore. Entities.Distributor

ich habe tryed alle Methoden (speichern, SaveOrUpdade, SaveOrUpdateCopy, Update). Aber es funktioniert nicht. Irgendwelche Ideen, wie man es repariert?

Antwort

1

Der Fehler ist, was es sagt - Ihre Sitzung enthält eine Instanz von User mit dieser ID, so dass, wenn Sie versuchen, eine andere User (a Distributor) mit dieser ID zu speichern, klagt NHibernate. Sie könnte versuchen, Ihre Sitzung Clearing (session.Clear()), bevor die Distributor speichern, aber ich weiß nicht, ob NHibernate erfolgreich sein wird, auf die Userund den Distributor Tisch plötzlich in sparen.

Wenn Sie in der Lage sind, Ihr Design zu ändern, ich schlage vor, Sie tun - in der Regel, sollten Sie nicht Vererbung verwenden, wenn die Art Ihrer Spezialisierung ändern könnte. Es ist viel besser und bequemer, eine Art von Role in Ihrer Domain einzuführen.

Vielleicht kann ich Ihnen etwas Inspiration geben, auch wenn ich die Besonderheiten Ihrer Domain nicht kenne: Wie wäre es damit, Benutzer einfach so zu lassen - Instanzen von User. Und dann User Macht Container ein IList<Role> und man konnte Role spezialisieren in z.B. Distributor (und andere Rollen, wenn das relevant ist)?

Oder wie wäre es mit Ihrer Firma ein IList<Distributor> enthalten, die jeweils auf eine User zeigen?

+0

Rollen sind im Design vorhanden. Aber ich brauche zusätzliche Felder für den Verteiler. Und die Vererbung wird verwendet, um die Entität breiter zu machen –

+0

Ich sehe. Aber warum nicht Ihre Rolle abstrakt machen und die Spezialisierungen mit irgendwelchen spezifischen Daten für diese Rolle begleiten? – mookid8000

+0

Leider es ist unmöglich, den Entwurf zu ändern, ich brauche Lösung in dieser Situation finden :( –