Château ActiveRecord: un à un
-
19-09-2019 - |
Question
Alors que jouer avec un à-un dans activerecord du château je suis tombé sur le problème suivant:
Je suis en train de modéliser un-à-un (utilisateur-userprofile dans ce cas). Je l'ai déjà appris que ce ne peut pas être une bonne pratique, mais Ignorons que pour un moment (je suis encore à essayer de comprendre ce qui se passe).
[ActiveRecord]
public class TestUser : ActiveRecordBase<TestUser>
{
[PrimaryKey(PrimaryKeyType.GuidComb)]
public Guid Id { get; set; }
}
[ActiveRecord]
public class TestUserProfile : ActiveRecordBase<TestUserProfile>
{
[PrimaryKey(PrimaryKeyType.GuidComb)]
public Guid Id { get; set; }
[OneToOne(Cascade = CascadeEnum.All, Fetch = FetchEnum.Join)]
public TestUser User { get; set; }
}
Je me attends le code suivant pour enregistrer un utilisateur avec le profil, ce qui donne le même identifiant dans la base de données:
[Test]
public void save_profile_saves_user()
{
var profile = new TestUserProfile
{
User = new TestUser()
};
profile.Save();
}
Le résultat réel est cependant que les deux objets sont enregistrés avec une autre touche. Est-ce que je manque quelque chose ??
La solution
J'ai trouvé la réponse moi-même. Le PrimaryKeyType du côté de la relation où OneToOne est défini devrait avoir un PrimaryKey de PrimaryKeyType.Foreign:
[ActiveRecord]
public class TestUserProfile : ActiveRecordBase<TestUserProfile>
{
[PrimaryKey(PrimaryKeyType.Foreign)]
public Guid Id { get; set; }
[OneToOne(Cascade = CascadeEnum.All, Fetch = FetchEnum.Join)]
public TestUser User { get; set; }
}
Retour à la lecture des documents plus en détail ...