Как переопределить каскадное правило конвенции в беглом nhibernate - PullRequest
5 голосов
/ 01 апреля 2009

У меня есть два класса

public class Document 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<File> Files { get; set; } 
} 
public class File 
{ 
    public virtual int Id { get; protected set; } 
    public virtual Document Document { get; set; } 
} 

со следующим соглашением:

public class HasManyConvention : IHasManyConvention 
{ 
    public bool Accept(IOneToManyPart target) 
    { 
        return true; 
    } 
    public void Apply(IOneToManyPart target) 
    { 
        target.Cascade.All(); 
    } 
} 

и эти переопределения карт

public class DocumentMappingOverride : IAutoMappingOverride<Document> 
{ 
    public void Override(AutoMap<Document> mapping) 
    { 
        mapping.HasMany(x => x.Files) 
            .Inverse() 
            // this line has no effect
            .Cascade.AllDeleteOrphan(); 
    } 
} 

public class FileMappingOverride : IAutoMappingOverride<File> 
{ 
    public void Override(AutoMap<File> mapping) 
    { 
        mapping.References(x => x.Document).Not.Nullable(); 
    } 
} 

Я понимаю, что мне нужно сделать IClassConvention для документа, чтобы изменить каскадное поведение, однако я не могу заставить это работать! Если я сделаю это:

public class DocumentConvention : IClassConvention 
{ 
    public bool Accept(IClassMap target) 
    { 
        return target.EntityType == typeof(Document); 
    } 
    public void Apply(IClassMap target) 
    { 
        target.SetAttribute("cascade", "all-delete-orphan"); 
    } 
} 

Я получаю: «Атрибут« каскад »не объявлен».

Если я сделаю это:

public class DocumentConvention : IClassConvention 
{ 
    public bool Accept(IClassMap target) 
    { 
        return target.EntityType == typeof(Document); 
    } 
    public void Apply(IClassMap target) 
    { 
        target.HasMany<Document, File>(x => x.Files) 
            .Inverse() 
            .Cascade.AllDeleteOrphan(); 
    } 
} 

Тогда я получаю:

"Duplicate collection role mapping Document.Files"

так что я добавил:

mapping.IgnoreProperty(x => x.Files); 

для сопоставления моего документа, но тогда Файлы всегда пустые. Что я делаю неправильно? Как я могу переопределить правило каскадирования для одного отношения HasMany? Спасибо Андрей

P.s. Извините за кросс-пост с this , но мне нужно, чтобы это было решено как можно скорее.

1 Ответ

0 голосов
/ 07 мая 2009

Я знаю, что это было всегда (в компьютерное время), и вы, возможно, уже решили это. Если это не так или кто-то другой с похожим вопросом видит это, то здесь:

Я думаю, вам нужно создать класс, который реализует IHasManyConvention. IClassConvention изменяет цель IClassMap (элемент <class>). cascade не является допустимым атрибутом для <class>, поэтому учитывает первую ошибку. При второй попытке вы переопределяли коллекцию, что приводило к ошибке «дубликат коллекции».

IHasManyConvention нацелен на IOneToManyPart, после чего вы сможете звонить Cascade.AllDeleteOrphan() или просто SetAttribute("cascade", "all-delete-orphan"), если первый не работал по какой-то причине.

EDIT

Извините, я пропустил, что у вас уже была IHasManyConvention. Поскольку вы хотите переопределить ваше соглашение только для одного типа, вы должны просто изменить метод Accept в своем соглашении для этого типа. Вместо return true; введите то, что было у вас на DocumentConvention:

return target.EntityType == typeof(Document);

Я полагаю, что OneToManyPart.EntityType ссылается на содержащий тип сущности (т.е. Document).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...