gpt4 book ai didi

c# - NHibernate 中的子表

转载 作者:行者123 更新时间:2023-11-30 16:36:42 24 4
gpt4 key购买 nike

我可以在 NHibernate 中使用以下实体吗

public class Person
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Pet> Pets { get; set; }
}

public class Pet
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}

并且不必在 Person 上创建一个“特殊的”AddPet 方法来保存 Child 宠物。

public void AddPet(Pet p)
{
p.Person = this;
Pets.Add(p);
}

_session.SaveOrUpdate(person);

不保存 Pets,因为 Pet 没有 Person 引用。

如果我更新 Pets 以包含此引用。

public class Pet
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Person Person { get; set; }
}

在新宠物上我仍然必须设置 Person 这对我来说似乎有点过分而且也有风险,因为人们仍然可以打电话

person.Pets.Add(new Pet())

我能想到的唯一其他选项是在添加子实体时设置父引用的自定义列表。

最佳答案

我稍微修改了您的示例(根据此处的许多建议):

public class Person
{
private IList<Pet> pets;

protected Person()
{}

public Person(string name)
{
Name = name;
pets = new List<Pet>();
}

public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual IEnumerable<Pet> Pets
{
get { return pets; }
}

public virtual void AddPet(Pet pet)
{
pets.Add(pet);
}
}

public class Pet
{
protected Pet()
{}

public Pet(string name)
{
Name = name;
}

public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
}

public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.Name);
HasMany(x => x.Pets).Cascade.AllDeleteOrphan().Access.AsLowerCaseField();
}
}

public class PetMap : ClassMap<Pet>
{
public PetMap()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.Name);
}
}

下面的测试:

    [Test]
public void CanSaveAndRetrievePetAttachedToPerson()
{
Person person = new Person("Joe");
person.AddPet(new Pet("Fido"));

Session.Save(person);

Person retrievedPerson = Session.Get<Person>(person.Id);
Assert.AreEqual("Fido", retrievedPerson.Pets.First().Name);
}

通过。

请注意,这是使用 Fluent NHibernate 进行映射和 session 。

关于c# - NHibernate 中的子表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/552736/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com