Sto usando NHibernate per i miei C# pojects e quindi ho diverse classi del modello.alternativa a chiamare un metodo virtuale in C#
lascia supporre il seguente esempio:
using System;
namespace TestProject.Model
{
public class Room
{
public virtual int Id { get; set; }
public virtual string UniqueID { get; set; }
public virtual int RoomID { get; set; }
public virtual float Area { get; set; }
}
}
Mappatura questi oggetti con NHibernate funziona bene finora. Ora voglio generare un nuovo oggetto Room e voglio memorizzarlo nel database. Per evitare di impostare separatamente ciascun membro, aggiungo un nuovo costruttore alla classe del modello. Di seguito i membri virtuali scrivo:
public RoomProperty()
{
}
public RoomProperty(int pRoomId, int pArea)
{
UniqueID = Guid.NewGuid().ToString();
RoomID = pRoomId;
Area = pArea;
}
Analizzando il mio codice con FxCop mi dice il seguente:
"ConstructorShouldNotCallVirtualMethodsRule"
This rule warns the developer if any virtual methods are called in the constructor of a non-sealed type. The problem is that if a derived class overrides the method then that method will be called before the derived constructor has had a chance to run. This makes the code quite fragile.
This page descrive anche il motivo per cui questo è sbagliato e ho anche capirlo. Ma io non sono sicuro come risolvere il problema.
Quando sono a cancellare tutti i costruttori e aggiungi il metodo seguente ...
public void SetRoomPropertyData(int pRoomId, int pArea)
{
UniqueID = Guid.NewGuid().ToString();
RoomID = pRoomId;
Area = pArea;
}
.... per impostare i dati dopo ho chiamato il costruttore di serie non posso iniziare il mio aplication becaue NHibernate fallisce l'inizializzazione. Dice:
NHibernate.InvalidProxyTypeException: The following types may not be used as proxies:
VITRIcadHelper.Model.RoomProperty: method SetRoomPropertyData should be 'public/protected virtual' or 'protected internal virtual'
Ma l'impostazione di questo metodo per virtual sarebbe lo stesso errore quando ho appena impostato i membri virtuali nel costruttore. Come posso evitare questi errori (violazioni)?
perché non impostare valori nei campi non proprietà in costruzione? –
@voroninp non è possibile accedere ai campi in modo semplice con NHibernate – Andrey
Perché il mio modello ha in realtà circa 10 membri e io creo nuovi oggetti della stanza qiet iften. Non voglio impostare separatamente ogni proprietà. – Metalhead89