Что надлежащий путь состоит в том, чтобы обновить nhibernate объект от метода действия POST asp.net?

Проблема в том, что вы создаете только один тег, а затем неоднократно модифицируете его атрибут string вместо создания трех отдельных тегов и вставки всех из них. Вот почему он добавляет только один тег и почему конечный результат является последним из строк.

Чтобы сделать то, что вы хотите, используйте цикл for и создайте новый тег для каждой из строк, например:

headTag = soup.find_all('h1', text='Attendance List')

for s in ["Today", "Weekly", "Monthly"]:
    aTag = soup.new_tag('a') 
    aTag['class'] = "btn btn-default pull-right"
    aTag.string = s
    headTag[0].insert_before(aTag)
8
задан Will Dean 15 October 2012 в 07:31
поделиться

2 ответа

Вот пример, который делает то, что я думаю, вы пытаетесь сделать. Дайте мне знать, если я неправильно понял, что вы пытаетесь сделать.

Учитывая следующие классы «домена»:

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 virtual void RemovePet(Pet pet)
    {
        pets.Remove(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()
        {
            LazyLoad();
            Id(x => x.Id).GeneratedBy.GuidComb();
            Map(x => x.Name);
            HasMany(x => x.Pets)
                   .Cascade.AllDeleteOrphan()
                   .Access.AsLowerCaseField()
                   .SetAttribute("lazy", "false");
        }
    }

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

Этот тест:

    [Test]
    public void CanDeleteChildren()
    {
        Person person = new Person("joe");

        Pet dog = new Pet("dog");
        Pet cat = new Pet("cat");

        person.AddPet(dog);
        person.AddPet(cat);

        Repository.Save(person);

        UnitOfWork.Commit();

        CreateSession();
        UnitOfWork.BeginTransaction();

        Person retrievedPerson = Repository.Get<Person>(person.Id);
        Repository.Evict(retrievedPerson);

        retrievedPerson.Name = "Evicted";

        Assert.AreEqual(2, retrievedPerson.Pets.Count());
        retrievedPerson.RemovePet(retrievedPerson.Pets.First());

        Assert.AreEqual(1, retrievedPerson.Pets.Count());

        Repository.Save(retrievedPerson);

        UnitOfWork.Commit();

        CreateSession();
        UnitOfWork.BeginTransaction();

        retrievedPerson = Repository.Get<Person>(person.Id);
        Assert.AreEqual(1, retrievedPerson.Pets.Count());
    }

запускает и генерирует следующий sql :

DeletingChildrenOfEvictedObject.CanDeleteChildren: пройдено NHibernate: INSERT INTO [Person] (Name, Id) VALUES (@ p0, @ p1); @ p0 = 'joe', @ p1 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2'

NHibernate: INSERT INTO [Pet] (Name, Id) VALUES (@ p0, @ p1); @ p0 = 'собака', @ p1 = '464e59c7-74d0-4317-9c22-9bf801013abb'

NHibernate: INSERT INTO [Pet] (Name, Id) VALUES (@ p0, @ p1); @ p0 = 'cat', @ p1 = '010c2fd9-59c4-4e66-94fb-9bf801013abb'

NHibernate: ОБНОВЛЕНИЕ [Pet] SET Person_id = @ p0 WHERE Id = @ p1; @ p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2', @ p1 = '464e59c7-74d0-4317-9c22-9bf801013abb'

NHibernate: ОБНОВЛЕНИЕ [Pet] SET Person_id = @ p0 WHERE Id = @ p1 @ p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2', @ p1 = '010c2fd9-59c4-4e66-94fb-9bf801013abb'

NHibernate: ВЫБЕРИТЕ person0_.Id as Id5_0_, person0.; @ p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2'

NHibernate: ВЫБЕРИТЕ pets0_.Person_id в качестве Person3_1_, pets0_.Id в качестве Id1_, pets0_.Id в качестве Id6_0_, pets0_ pets__0_0_0_0_0___________________________________________ [0_0_0], в качестве идентификаторов Id6_0_ .Person_id = @ p0 ; @ p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2'

NHibernate: ОБНОВЛЕНИЕ [Персона] SET Name = @ p0 WHERE Id = @ p1; @ p0 = 'Evicted', @ p1 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2'

NHibernate: ОБНОВЛЕНИЕ [Pet] SET Name = @ p0 WHERE Id = @ p1; @ p0 = 'собака', @ p1 = '464e59c7-74d0-4317-9c22-9bf801013abb' NHibernate: ОБНОВЛЕНИЕ [Pet] SET Person_id = null WHERE Person_id = @ p0 AND Id = @ p1; @ p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2', @ p1 = '010c2fd9-59c4-4e66-94fb-9bf801013abb'

NHibernate: УДАЛИТЬ ИЗ [Pet] WHERE Id = @ p0; @ p0 = '010c2fd9-59c4-4e66-94fb-9bf801013abb'

NHibernate: ВЫБЕРИТЕ person0_.Id as Id5_0_, person0_.Name как Name5_0_ FROM [Person] person0_ WHERE person0_.Id=@p0 ; @ p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2'

NHibernate: ВЫБЕРИТЕ pets0_.Person_id как Person3_1_, pets0_.Id как Id1_, pets0_.Id как Id6_0_, pets0_. pets__0_0_0_0_0_0_0_0_______________________________________ [{0], домашних животных 0__ .Person_id = @ p0; @ p0 = 'cd123fc8-6163-42a5-aeeb-9bf801013ab2'

Обратите внимание на УДАЛЕНИЕ ИЗ [Pet] ...

, поэтому вам нужно уметь вручную перетаскивать объект Person (в этом примере ) с измененными коллекциями, и он должен быть в состоянии определить, что удалять. Убедитесь, что у вас установлен атрибут Cascade.AllDeleteOrphan ().

4
ответ дан 5 December 2019 в 23:17
поделиться

Ответ Роба убедил меня более внимательно взглянуть на ' загрузить существующий элемент в новый сеанс, а затем объединить подход, и, конечно, есть ISession.Merge, который, кажется, делает именно то, что я хотел, то есть взять новый объект и объединить его со своим предшественником, который только что был перезагружен в вторая сессия.

Поэтому я думаю, что ответ на вопрос, который я пытался задать, это «перезагрузить существующую сущность и затем вызвать ISession.Merge с новой сущностью».

1
ответ дан 5 December 2019 в 23:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: