編集後 - 以下の編集を参照
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 が巨大になる可能性があるため、上記を追加したくありません。投稿をシステムに持ち込むたびに必要というわけではありません。そのような情報を計算するための別のクエリが必要です。
この最後の部分を解決するのを手伝ってくれる人はいますか? 御時間ありがとうございます。