2009-02-25 3 views
21

Fluent NHibernate가있는 AutoMap Persistence Model을 사용하여 계단식 저장을 "켜는"방법은 무엇입니까? 에Cascade는 Fluent NHibernate AutoMapping으로 저장합니다.

로 : 나는 사람과 팔을 저장

도 저장해야합니다.

public class Person : DomainEntity 
{ 
    public virtual Arm LeftArm { get; set; } 
} 

public class Arm : DomainEntity 
{ 
    public virtual int Size { get; set; } 
} 

내가 an article on this topic 발견 - "세척하기 전에 transient 인스턴스를 저장 객체가 저장되지 않은 과도 인스턴스를 참조"하지만 오래된 것으로 보인다 현재 내가

얻을.

+0

규칙을 사용하여 수행 할 수 있습니까? –

답변

13

이것은 새로운 구성 비트와 함께 작동합니다. 자세한 내용은 http://fluentnhibernate.wikia.com/wiki/Converting_to_new_style_conventions

//hanging off of AutoPersistenceModel  
.ConventionDiscovery.AddFromAssemblyOf<CascadeAll>() 


public class CascadeAll : IHasOneConvention, IHasManyConvention, IReferenceConvention 
{ 
    public bool Accept(IOneToOnePart target) 
    { 
     return true; 
    } 

    public void Apply(IOneToOnePart target) 
    { 
     target.Cascade.All(); 
    } 

    public bool Accept(IOneToManyPart target) 
    { 
     return true; 
    } 

    public void Apply(IOneToManyPart target) 
    { 
     target.Cascade.All(); 
    } 

    public bool Accept(IManyToOnePart target) 
    { 
     return true; 
    } 

    public void Apply(IManyToOnePart target) 
    { 
     target.Cascade.All(); 
    } 
} 
+0

감사합니다. –

+0

감사합니다. 나는 실제로 Kristoffers 짧은 예제를 사용하지만 이것 역시 잘 작동하는지 확신합니다. –

1

모든 유형의 기본 규칙을 계단식으로 만들 수도 있습니다. 예를 들어, 시작 지점으로 링크 된 기사를 사용하면 다음과 같습니다.

autoMappings.WithConvention(c => 
    { 
    // our conventions 
    c.OneToOneConvention = o => o.Cascade.All(); 
    c.OneToManyConvention = o => o.Cascade.All(); 
    c.ManyToOneConvention = o => o.Cascade.All(); 
    }); 
3

을 참조하십시오. 협약 서명 서명이 변경되었습니다. 이 질문에 정확히 나오는 새로운 대답은 THIS QUESTION을 참조하십시오. 하여 현재 버전을 사용하기 위해 업데이트

13

:

.Conventions.Add(DefaultCascade.All());  

로 이동 :

public class CascadeAll : IHasOneConvention, IHasManyConvention, IReferenceConvention 
{ 
    public void Apply(IOneToOneInstance instance) 
    { 
     instance.Cascade.All(); 
    } 

    public void Apply(IOneToManyCollectionInstance instance) 
    { 
     instance.Cascade.All(); 
    } 

    public void Apply(IManyToOneInstance instance) 
    { 
     instance.Cascade.All(); 
    } 
} 
+1

"public void Apply (IOneToManyCollectionInstance instance) "에 대해 "instance.inverse();"가 유용하다는 것을 알았습니다. "instance.Cascade.All()." – Antony

+0

감사합니다.이 코드는 저에게 효과적입니다. –

+0

@Antony 반대로 나를 위해 트릭을했습니다. 감사! –

4

나는 전체 프로젝트에 대해이 작업을 수행하기 위해 찾은 가장 쉬운 방법은 DefaultCascade을 사용하는 것입니다 위키의 "The Simplest Conventions" 섹션과 이에 대한 정보 및 다른 사람들의 목록 위키의 메소드 이름의 일부가 잘못 될 수 있습니다 -

Table.Is(x => x.EntityType.Name + "Table") 
PrimaryKey.Name.Is(x => "ID") 
AutoImport.Never() 
DefaultAccess.Field() 
DefaultCascade.All() 
DefaultLazy.Always() 
DynamicInsert.AlwaysTrue() 
DynamicUpdate.AlwaysTrue() 
OptimisticLock.Is(x => x.Dirty()) 
Cache.Is(x => x.AsReadOnly()) 
ForeignKey.EndsWith("ID") 

경고의 말씀 :

다음은 위키의 목록입니다. 내가 검증 할 수있는 (즉 DefaultCascade와 DefaultLazy) 위키를 편집했지만 나머지는 보증 할 수 없습니다. 그러나 필요한 경우 Intellisense를 사용하여 적절한 이름을 알아낼 수 있어야합니다.

+0

그 링크를보고 싶지만 죽었습니다 – Joel

+0

@Joel : 새 위키가 다음과 같이 보입니다 : https://github.com/jagregory/fluent-nhibernate/wiki/ 대회 – RedGreenCode