0

私は流暢な nhibernate を使用しています。delete cascade をオンにします。しかし、私は働きません。外部キーのみを削除します。次の構成は流暢な nhibernate です。

        public virtual void TreatConfiguration(NHibernate.Cfg.Configuration configuration)
    {
        var update = new SchemaUpdate(configuration);
        update.Execute(false, true);
    }

    public ISessionFactory CreateSessionFactory(string istanza, string db)
    {
        //string server = @"BRUX-PC\SQLEXPRESS";
        //int port = 1433;
        string server = istanza;
        string database = db;
        const string user = "xxxx";
        const string password = "xxxx";

        var connectionString = string.Format("Server={0};Database={1};User Id={2};Password={3};",
                                             server, database, user, password);

        var autoMap = AutoMap.AssemblyOf<AggregateBase>()
                             .Where(t => typeof (AggregateBase).IsAssignableFrom(t))
                             .Conventions.Add(
                                 ConventionBuilder.HasMany.Always(x => x.Cascade.AllDeleteOrphan()),
                                 PrimaryKey.Name.Is(o => "Id"),
                                 ForeignKey.EndsWith("Id"),
                                 DefaultLazy.Never(),
                                 DefaultCascade.All(),
                                 DynamicUpdate.AlwaysTrue(),
                                 DynamicInsert.AlwaysTrue()
            );



        return Fluently.Configure()
                       .Database(
                           MsSqlConfiguration.MsSql2008.ConnectionString(connectionString))
                       .Mappings(m => m.AutoMappings.Add(autoMap))
                       .ExposeConfiguration(TreatConfiguration)
                       .BuildSessionFactory();
    }

私のコントローラー:

                        contabilitaRepository.RemoveByIdFattura(testataContabilita.IdFattura);

私のリポジトリ:

       public void RemoveByIdFattura(Guid? id)
    {
        var userToDelete =
            repository.Single(c => c.IdFattura == id);

        repository
            .Remove(userToDelete);
    }

私のモデル:

    public  class TestataContabilita : AggregateBase
    {
        public virtual Guid IdFattura
        {
            get;
            set;
        }
        public virtual int NumeroRegistrazione
        {
            get;
            set;
        }
        public virtual  string TipoVendita
        {
            get;
            set;
        }

        public virtual IList<CorpoContabilita> CorpoContabilita { get; set; }


    }

     public  class CorpoContabilita : AggregateBase
    {

        public virtual int NumeroRegistrazione
        {
            get;
            set;
        }
        public virtual int? ControPartita
        {
            get;
            set;
        }
        public virtual string Automatico
        {
            get;
            set;
        }
}

削除を実行すると、「CorpoContabilita」が残っている間に「TestataContabilita」のみが削除されますが、Foregin キーのみが削除されます。なぜ?

4

2 に答える 2

1

あなたのケースを再現しようとしました。ある種のリポジトリを実装しましたが、マッピングは想定どおりに機能します。CorpoContabilita のコレクションを持つ testataContabilita オブジェクトを削除します。

しかし、最初は誤ってリポジトリでいくつかの間違いを犯し、外部キーでも null を取得しました。実際には、testataContabilita を削除する前でも null でした - 実装のエラーが原因です。

では、どのリポジトリ実装を使用していますか? Session オブジェクトと Transaction オブジェクトをどのように操作しますか? どのオブジェクトを保存しますか? プロジェクトを完全に実装してどこかにアップロードできるかもしれません。

于 2013-06-21T07:29:12.903 に答える