5

私は2つのクラスがあります

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 for Documentを作成する必要があることを理解していますが、これを機能させることはできません。私がこれを行う場合:

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"); 
    } 
} 

「'cascade'属性は宣言されていません。」

私がこれを行う場合:

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関係のカスケードルールをオーバーライドするにはどうすればよいですか?アンドリューありがとう

PSこれとのクロスポストについては申し訳ありませんが、私はこれをできるだけ早く解決する必要があります。

4

1 に答える 1

0

これはずっと前 (コンピューター時間) であり、既に解決されている可能性があります。あなたがこれを見たことがない場合、または同様の質問をしている他の人がこれを見た場合は、次のようになります。

を実装するクラスを作成する必要があると思いますIHasManyConvention。(要素) ターゲットIClassConventionを変更します。は有効な属性ではないため、最初のエラーが原因です。2 回目の試行では、コレクションを再マッピングしていたため、「コレクションが重複しています」というエラーが発生しました。IClassMap<class>cascade<class>

IHasManyConventionIOneToManyPartを呼び出すことができるか、何らかの理由で前者が機能しなかった場合にCascade.AllDeleteOrphan()のみ、をターゲットにします。SetAttribute("cascade", "all-delete-orphan")

編集

申し訳ありませんが、既に IHasManyConvention があったことを見逃していました。1 つの型だけの規則をオーバーライドしたいので、Acceptその型の規則のメソッドを変更するだけです。の代わりにreturn true;、あなたが持っていたものを引き込みますDocumentConvention

return target.EntityType == typeof(Document);

OneToManyPart.EntityType含まれているエンティティ タイプ (つまり)を参照していると思いますDocument

于 2009-05-07T16:59:26.587 に答える