0

編集後 - 以下の編集を参照

SHarp アーキテクチャの一部として使用されている FLuent Automapping について質問があります。テスト ケースの 1 つを実行すると、DB にテーブルを作成するために使用できるスキーマが生成されます。

投稿と、これらの投稿に関連付けられたタグを含むサイトを開発しています。タグを複数の投稿に関連付け、各投稿に 0 個以上のタグを付けられるようにしたい。

次のDBスキーマを実現したい:

投稿 {Id, Title, SubmitTime, Content}

タグ {ID、名前}

PostTag {PostId, TagId}

代わりに、私は得ています:

投稿 {Id, Title, SubmitTime, Content}

タグ {ID、名前、PostID (FK)}

私はシャープなアーキテクチャを使用しており、クラスは次のようになります (多かれ少なかれ):

public class Post : Entity
{
    [DomainSignature]
    private DateTime _submittime;
    [DomainSignature]
    private String _posttitle;

    private IList<Tag> _taglist;

    private String _content;

    public Post() { }

    public Post(String postTitle)
    {
        _submittime = DateTime.Now;
        _posttitle = postTitle;
        this._taglist = new List<Tag>();
    }


    public virtual DateTime SubmitTime { get { return _submittime; } private set { _submittime = value; } }

    public virtual string PostTitle { get { return _posttitle; } private set { _posttitle = value; } }

    public virtual string Content { get { return _content; } set { _content = value; } }

    public virtual IList<Tag> TagList { get { return _taglist; }  set { _taglist = value; } }




 public class Tag : Entity
{
    [DomainSignature]
    private String _name;

    public Tag() { }

    public Tag(String name)
    {
        this._name = name;
    }

    public virtual String Name
    {
        get { return _name; }
        private set { _name = value; }
    }

    public virtual void EditTagName(String name)
    {
        this.Name = name;
    }

}

オブジェクトが別のオブジェクトの一部としてのみ存在できる場合があるため、DB スキーマの設定がなくなった理由がわかります。ただし、タグは個別に存在できます。

これを達成するにはどうすればよいですか?私は MVC、Nhibernate、SHarp アーキテクチャなどにまったく慣れていないので、どんな助けでも大歓迎です!

編集*

OK、クラスを少し調整しました。私の問題は、中間テーブルが推測されることを期待していたことです。代わりに、私はそれを作成する必要があることに気づきました。だから私は今持っています(読みやすくするためにクラスを少し単純化しました.:

class Post : Entity
{
 [DomainSignature]
 String Title
 [DomainSignature]
 DateTime SubmitTime
 IList<PostTag> tagList

}

class Tag : Entity
{
[DomainSignature]
string name
}

class PostTag : Entity
{
[DomainSignature]
Post post
[DomainSignature]
Tag tag
}

これにより、中間エンティティのスキーマと、通常の Post および Tag テーブルが得られます。

PostTag{id, name, PostId(FK)}

上記の問題は、Tag の外部キーがまだ含まれていないことです。また、これはリレーショナル テーブルであるため、本当に ID 列が必要ですか? Post テーブルと Tag テーブルの両方の PK で構成される複合キーであるべきだと思います。

きっとTagクラスに追加することで

IList<PostTag> postList

PostTag スキーマに別の FK を追加しますが、postList が巨大になる可能性があるため、上記を追加したくありません。投稿をシステムに持ち込むたびに必要というわけではありません。そのような情報を計算するための別のクエリが必要です。

この最後の部分を解決するのを手伝ってくれる人はいますか? 御時間ありがとうございます。

4

1 に答える 1

0

わかりました。ドメイン内の複合クラスのモデリングは前進であると信じられていましたが、最終的に、クラスを作成しなくても複合テーブルを作成するオートマッパーオーバーライドコードに出くわしました。そもそも私が期待していたこと:

public class PostMappingOverride:IAutoMappingOverride {public void Override(AutoMapping map){

            map.HasManyToMany(e => e.TagList)
               .Inverse()
               .Cascade.SaveUpdate();
        }
    }

これで私のスキーマが得られます(単純化されていない次のスキーマ):

create table Posts (
    Id INT not null,
   PublishTime DATETIME null,
   SubmitTime DATETIME null,
   PostTitle NVARCHAR(255) null,
   Content NVARCHAR(255) null,
   primary key (Id)
)

create table Posts_Tags (
    PostFk INT not null,
   TagFk INT not null
)

create table Tags (
    Id INT not null,
   Name NVARCHAR(255) null,
   primary key (Id)
)

alter table Posts_Tags 
    add constraint FK864F92C27E2C4FCD 
    foreign key (TagFk) 
    references Tags

alter table Posts_Tags 
    add constraint FK864F92C2EC575AE6 
    foreign key (PostFk) 
    references Posts

投げる人は私が1対多の関係を探していたということだと思います、それはそうです、しかしそれはここではHasManytoMAnyと呼ばれています...

于 2011-09-28T19:53:58.753 に答える