Witam serdecznie, to znowu ja :D
Mam problem z zapisem obiektu, który ma obiekt dziecko i obiekt wnuka do bazy.
Są 3 obiekty:
User
UserData
City
(nie sugerujcie się kodem co do CITY, bo próbowałem najróżniej, po prostu taki zostawiłem niedziałający)
I teraz tak, UserEntity wygląda następująco:
public class UserEntity : BaseEntity
{
public virtual string Password { get; set; }
public virtual string Email { get; set; }
public virtual UserDataEntity UserData { get; set; }
}
UserDataEntity:
public class UserDataEntity : BaseEntity
{
public virtual UserEntity User { get; set; }
public virtual CityEntity City { get; set; }
public UserDataEntity()
{
City = new CityEntity();
}
}
Mapowanie UserEntity:
public class UserMap: ClassMap<UserEntity>
{
public UserMap()
{
Schema("\"MyPuppy\"");
Table("\"User\"");
Id(x => x.ID).Column("id");
Map(x => x.Password).Column("password").Nullable();
Map(x => x.Email).Column("email").Nullable();
HasOne(x => x.UserData).LazyLoad().ForeignKey("fk_user").Cascade.All();
}
}
Mapowanie UserDataEntity:
public class UserDataMap : ClassMap<UserDataEntity>
{
public UserDataMap()
{
Schema("\"MyPuppy\"");
Table("\"User_Data\"");
Id(x => x.ID).Column("id");
References(x => x.User).LazyLoad().Column("fk_user").Unique();
References(x => x.City).LazyLoad().Column("fk_city").Unique();
//HasOne(x => x.City).LazyLoad().ForeignKey("fk_city").Cascade.All();
}
}
W controlerze (operuję na obiektach DTO, później automaper wrzuca je do Entity, wszystkie dane się zgadzają):
[HttpPost]
[AllowAnonymous]
public ActionResult Register(UserDTO newUser, string returnUrl)
{
if (ModelState.IsValid)
{
newUser.UserData.User = newUser;
newUser.UserData.City.UserData = newUser.UserData;
try
{
_userService.Save(newUser);
}
To działa, UserData i User mają wpisy w bazie, UserData zawiera FK do User i jest ok
W bazie wygląda to tak:
User ma ID
UserData ma ID i FK_USER
Teraz kwestia City i tu jest trochę inaczej, sytuacja jest odwrócona jeśli chodzi o bazę (nie wiem czy może tak być czy powinno być tak jak w User -> UserData) UserData ma FK do obiektu podrzędnego czyli City:
UserData ma FK_CITY
City ma ID
CityEntity:
public class CityEntity : BaseEntity
{
public virtual UserDataEntity UserData { get; set; }
public virtual string Name { get; set; }
public virtual string Code { get; set; }
}
CityMap:
public class CityMap : ClassMap<CityEntity>
{
public CityMap()
{
Schema("\"MyPuppy\"");
Table("\"City\"");
LazyLoad();
Id(x => x.ID).Column("id");
Map(x => x.Name).Column("name").Nullable();
Map(x => x.Code).Column("code").Nullable();
HasOne(x => x.UserData).LazyLoad().ForeignKey("fk_city").Cascade.All();
//References(x => x.UserData).LazyLoad().Column("fk_city").Unique();
}
}
Nie wiem jak to powinno wyglądać prawidłowo. Czy mam zmienić strukturę bazy i wrzucić FK_USER_DATA do tabeli City i zrobić adekwatnie do User -> UserData. Czy może da się zrobić to z aktualną strukturą tylko totalnie spieprzyłem mapowanie.
Proszę bardzo o pomoc.