Castle ActiveRecord: one-to-one
-
19-09-2019 - |
Pergunta
Enquanto a brincar com one-to-one associações no castelo activerecord me deparei com o seguinte problema:
Eu estou tentando modelar um relacionamento one-to-one (user-userprofile neste caso). Eu já aprendi que isso pode não ser uma boa prática, mas vamos ignorar por um momento (eu ainda estou tentando entender o que está acontecendo).
[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; }
}
Eu esperaria o seguinte código para salvar um usuário com perfil, produzindo o mesmo ID no banco de dados:
[Test]
public void save_profile_saves_user()
{
var profile = new TestUserProfile
{
User = new TestUser()
};
profile.Save();
}
O resultado real, porém, é que ambos os objetos são guardados com uma chave diferente. Estou faltando alguma coisa ??
Solução
Eu encontrei a resposta sozinho. O PrimaryKeyType do lado da relação, onde OneToOne é definido deve ter um 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; }
}
Voltar para ler os docs mais profundamente ...