Używam NHibernate dla moich obiektów C# i dlatego mam kilka klas modeli.Alternatywa dla wywoływania wirtualnej metody w C#
Załóżmy następujący przykład:
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; }
}
}
mapowanie tych obiektów z NHibernate działa dobrze do tej pory. Teraz chcę wygenerować nowy obiekt Room i chcę go zapisać w bazie danych. Aby uniknąć ustawiania każdego członka osobno, dodaję nowy konstruktor do klasy modelu. Poniżej wirtualnych członków piszę:
public RoomProperty()
{
}
public RoomProperty(int pRoomId, int pArea)
{
UniqueID = Guid.NewGuid().ToString();
RoomID = pRoomId;
Area = pArea;
}
Analizując mojego kodu z FxCop mówi mi, co następuje:
"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 opisuje również, dlaczego to jest złe i ja także zrozumieć. Ale nie jestem pewien, jak rozwiązać problem.
Kiedy usunięcie wszystkich konstruktorów i dodaj następujący sposób ...
public void SetRoomPropertyData(int pRoomId, int pArea)
{
UniqueID = Guid.NewGuid().ToString();
RoomID = pRoomId;
Area = pArea;
}
.... ustawić dane po zadzwoniłem średnia konstruktor nie mogę rozpocząć mój Aplikacja becaue NHibernate nie inicjalizacji. Mówi:
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'
ale ustawienie tej metody do wirtualnego byłby taki sam błąd jak wtedy, gdy po prostu ustawić wirtualnych członków w konstruktorze. Jak mogę uniknąć tych błędów (naruszeń)?
dlaczego nie ustawić wartości w polach nie właściwości na budowie? –
@voroninp nie można uzyskać dostępu do pól, które można łatwo z NHibernate – Andrey
Ponieważ mój model faktycznie ma około 10 członków i tworzę nowe obiekty pokojowe qiet iften. Nie chcę osobno ustawić każdej własności. – Metalhead89