0

MsSQL2012 には、次のように作成した 2 つのテーブルを含む単純なデータベースがあります。

CREATE TABLE Company
(
 Id int NOT NULL IDENTITY,
 Name varchar(255),
 PRIMARY KEY (Id) 
)    

CREATE TABLE Department
(
 Id int NOT NULL PRIMARY KEY IDENTITY,
 Name varchar(255),
 Company_Id int NOT NULL,
 FOREIGN KEY (Company_Id) REFERENCES Company(Id)
);

対応するキャッスル アクティブ レコード クラス:

会社

[ActiveRecord]
    public class Company : ActiveRecordBase<Company>
    {
        [PrimaryKey]
        public int Id { get; set; }

        [Property]
        public string Name { get; set; }

        [HasMany(typeof(Department))]
        public IList<Department> Departments { get; set; }
    }

デパートメント

[ActiveRecord]
    public class Department : ActiveRecordBase<Department>
    {
        [PrimaryKey]
        public int Id { get; set; }

        [Property]
        public string Name { get; set; }

        [HasMany(typeof(Employee))]
        public IList<Employee> Employees { get; set; }

        [BelongsTo(Type = typeof(Company), Column = "Id")]
        public Company Company
        {
            get; set;
        }
    }

会社と部門を取得する C# コード:

 ActiveRecordStarter.Initialize(ActiveRecordSectionHandler.Instance, typeof(Company), typeof(Department));
 var companys = Company.FindAll();//ALL IS FINE, I get a list of companies
 var departments = Department.FindAll();//HERE IS EXCEPTION

例外:

未処理の例外: Castle.ActiveRecord.Framework.ActiveRecordException: 部門の FindAll を実行できませんでした ---> NHibernate.ObjectNotFoundException: 指定された識別子を持つ行が存在しません [ActiveRecordDemo.Domain.Company#4]
NHibernate.Impl.SessionFactoryImpl.DefaultEntityNotFoundDelegate.HandleEntityNotFound (文字列エンティティ名、オブジェクト ID) で NHibernate.Event.Default.DefaultLoadEventListener.Load (LoadEvent イベント、IEntityPersister 永続化、EntityKey keyToLoad、LoadType オプション) で NHibernate.Event.Default.DefaultLoadEventListener.ProxyOrLoad (LoadEvent イベント、IEntityPersister 永続化、EntityKey keyToLoad、LoadType オプション) NHibernate.Impl.Impl. NHibernate.Type.Type.EntityType.ResolveIdentifier(オブジェクト ID、ISessionImplementor セッション) の SessionImpl.InternalLoad(String entityName、オブジェクト ID、ブール値の熱心な、ブール値の isNullable)。NHibernate.Loader.Loader.InitializeEntitiesAndCollections(IList hydredObjects, Object NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor セッション、QueryParameters queryParameters、ブール型 returnProxies) の NHibernate.Loader.Loader.DoQuery(ISessionImplementor セッション、QueryParameters queryParameters、ブール型 returnProxies) NHibernate.Loader.Loader の .DoList(ISessionImplementor セッション、QueryParameters queryParameters)。NHibernate.Loader.Loader.List(ISessionImplementor セッション、QueryParameters queryParameters、ISet の ListIgnoreQueryCache(ISessionImplementor セッション、QueryParameters queryParameters)1 querySpaces, IType[] resultTypes) at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session) at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) at NHibernate.Impl.CriteriaImpl.List(IList results) at NHibernate.Impl.CriteriaImpl.List() at Castle.ActiveRecord.ActiveRecordBase.FindAll(Type targetType, DetachedCriteria detachedCriteria, Order[] orders) --- End of inner exception stack trace --- at Castle.ActiveRecord.ActiveRecordBase.FindAll(Type targetType, DetachedCriteria detachedCriteria, Order[] orders) at Castle.ActiveRecord.ActiveRecordBase.FindAll(Type targetType) at Castle.ActiveRecord.ActiveRecordBase1.FindAll()

会社を取得するとすべて問題ありませんが、部門を取得すると上記の例外が発生します。どこで間違えた?

4

1 に答える 1

0

NotFoundBehaviour .Ignore パラメータをBelongsToAttributeに追加することで、この例外を取り除くことができました。

[BelongsTo(Type = typeof(Company), Column = "Id", NotFoundBehaviour = NotFoundBehaviour.Ignore)]

[BelongsTo(Type = typeof(Department), Column = "Id", NotFoundBehaviour = NotFoundBehaviour.Ignore)]

それが解決策なのか回避策なのかはわかりません)が、すべて正常に機能し、すべての単体テストに合格しました。

于 2013-07-30T15:47:17.967 に答える