2010-12-16 4 views
0

У меня возникают проблемы с использованием ActiveRecord с интерфейсами. Когда я использую его без интерфейсов, все работает, но когда я использую его с интерфейсами, он работает иногда, а не иногда, и он очень случайный. Если он будет работать, он продолжит работу до тех пор, пока некоторые изменения не будут внесены в мой проект и не перекомпилируются. Затем, если он перестанет работать, это не сработает, пока я снова не сделаю некоторые несвязанные изменения и не перекомпиляю. Ниже вы можете увидеть мои модели. У вас есть представление о том, как я могу это решить?Сбой ActiveRecord с интерфейсами

[ActiveRecord] 
    public class ContactInformation : ActiveRecordValidationBase<ContactInformation> 
    { 
     public ContactInformation() 
     { 
      Emails = new List<Email>(); 
} 
     [PrimaryKey] 
     public int Id { get; set; } 
     [HasMany(typeof(Email), Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, "type='1'")] 
     private IList<Email> Emails { get; set; } 



    [ActiveRecord("Details", 
    DiscriminatorColumn = "int", 
    DiscriminatorType = "type", 
    DiscriminatorValue = "1")] 
    public class Email : Detail<Email> 

    [ActiveRecord("Details", 
    DiscriminatorColumn = "int", 
    DiscriminatorType = "type", 
    DiscriminatorValue = "0")] 
public class Detail<T> : ActiveRecordValidationBase<T>, IDetail where T : class 
{ 
    [PrimaryKey] 
    public int Id { get; set; } 

    [BelongsTo] 
    public ContactInformation ParentContactInformation { get; set; } 

public interface IDetail 
{ 
    int Id { get; set; } 
    ContactInformation ParentContactInformation { get; set; } 
} 

следующее исключение:

SetUp : System.NullReferenceException : Object reference not set to an instance of an object. 
at Castle.ActiveRecord.Framework.Internal.XmlGenerationVisitor.WriteCompositeColumns(String[] columns) 
at Castle.ActiveRecord.Framework.Internal.XmlGenerationVisitor.WriteCollection(ManyRelationCascadeEnum cascadeEnum, Type targetType, RelationType type, String name, String accessString, String table, String schema, Boolean lazy, Boolean inverse, String orderBy, String where, String sort, String columnKey, String[] compositeKeyColumnKeys, String element, Type elementType, String columnRef, String[] compositeKeyColumnRefs, IVisitable extraModel, String index, String indexType, CacheEnum cache, String cacheregion, NotFoundBehaviour notFoundBehaviour, FetchEnum fetch, Int32 batchSize, Type collectionType) 
at Castle.ActiveRecord.Framework.Internal.XmlGenerationVisitor.VisitHasMany(HasManyModel model) 
at Castle.ActiveRecord.Framework.Internal.HasManyModel.Accept(IVisitor visitor) 
at Castle.ActiveRecord.Framework.Internal.AbstractDepthFirstVisitor.VisitNodes(IEnumerable nodes) 
at Castle.ActiveRecord.Framework.Internal.XmlGenerationVisitor.VisitModel(ActiveRecordModel model) 
at Castle.ActiveRecord.Framework.Internal.XmlGenerationVisitor.CreateXml(ActiveRecordModel model) 
at Castle.ActiveRecord.ActiveRecordStarter.AddXmlToNHibernateCfg(ISessionFactoryHolder holder, ActiveRecordModelCollection models) 
at Castle.ActiveRecord.ActiveRecordStarter.RegisterTypes(ISessionFactoryHolder holder, IConfigurationSource source, IEnumerable`1 types, Boolean ignoreProblematicTypes) 
at Castle.ActiveRecord.ActiveRecordStarter.Initialize(IConfigurationSource source, Type[] types) 
at Castle.ActiveRecord.ActiveRecordStarter.Initialize(Assembly[] assemblies, IConfigurationSource source, Type[] additionalTypes) 
at Castle.ActiveRecord.ActiveRecordStarter.Initialize(Assembly assembly, IConfigurationSource source) 
at tests.Framework.ModelTests.SetUpFixture() in ModelTests.cs: line 18 

Это мой SetUpFixture

[TestFixtureSetUp] 
public void SetUpFixture() 
{ 
    if (ActiveRecordStarter.IsInitialized) return; 

    IConfigurationSource source = ActiveRecordSectionHandler.Instance; 
    ActiveRecordStarter.Initialize(Assembly.Load("Model"), source); 
    XmlConfigurator.Configure(); 
} 

Я проверил файлы, созданные и детали файлов имеет это имя файла Detail`1.hbm.xml и это обратные одиночные кавычки содержание:

<?xml version="1.0" encoding="utf-16"?> 
<hibernate-mapping auto-import="true" default-lazy="false" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Model.Contact.Detail`1, Model" table="Details" discriminator-value="0"> 
    <id name="Id" access="property" column="Id" type="Int32" unsaved-value="0"> 
     <generator class="native"> 
     </generator> 
    </id> 
    <discriminator column="type" type="int" /> 

    <property name="Owner" access="property" type="String"> 
     <column name="Owner"/> 
    </property> 
    <property name="Location" access="property" type="String"> 
     <column name="Location"/> 
    </property> 
    <property name="ContactDetail" access="property" type="String"> 
     <column name="ContactDetail"/> 
    </property> 
    <many-to-one name="ParentContactInformation" access="property" class="Model.ContactInformation,Model" column="ParentContactInformation" lazy="proxy" /> 
    <subclass name="Model.Contact.Email, Model" discriminator-value="3"> 
    </subclass> 
    <subclass name="Model.Contact.Phone, Model" discriminator-value="1"> 
    </subclass> 
    <subclass name="Model.Contact.Fax, Model" discriminator-value="2"> 
    </subclass> 
    </class> 
</hibernate-mapping> 

ответ

0

Таким образом, после некоторого тестирования я обнаружил, что я могу использовать общие классы. Проблема заключалась в том, что я должен был двигаться

[BelongsTo] 
public ContactInformation ParentContactInformation { get; set; } 

из моего Detail класса в класс ребенка (электронная почта) по какой-то причине BelongsTo должен быть у детей.

+0

, основная проблема все еще существует: нет смысла отображать открытые общие классы. – 2010-12-20 02:40:09

0

Проблема в том, что вы пытаетесь сопоставить класс с неопределенным параметром типа (т. открытый общий класс). Вам нужно отобразить конкретные классы. Смотрите это для получения дополнительной информации:

+0

Я изменил мою модель детали в открытый класс. Подробно: ActiveRecordValidationBase, IDetail - но я получаю то же исключение, что и раньше, с тем же шаблоном, который он работает иногда, а не в некоторые другие моменты. Когда он работает сейчас, имя файла верное без обратного вызова – unkownt 2010-12-17 05:56:37