Fluent Automapper проблема с созданием тегов - PullRequest
0 голосов
/ 26 сентября 2011

ПОСЛЕ РЕДАКТИРОВАНИЯ - см. Редактирование ниже

У меня есть вопрос об Automapping FLuent, который используется как часть архитектуры Sharp. Выполнение одного из тестовых примеров создаст схему, которую я могу использовать для создания таблиц в моей БД.

Я разрабатываю сайт с сообщениями и тегами, связанными с этими сообщениями. Я хочу, чтобы тег мог быть связан с более чем одним сообщением, и чтобы каждое сообщение имело 0 или более тегов.

Я хочу получить схему БД:

Post {Id, Title, SubmitTime, Content}

Tag {Id, Name}

PostTag {PostId, TagId}

Вместо этого я получаю:

Post {Id, Title, SubmitTime, Content}

Tag {Id, Name, 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;
    }

}

Я могу понять, почему он не подходит для установленной схемы БД, поскольку есть моменты, когда объект может существовать только как часть другого. Но тег может существовать отдельно.

Как бы я пошел для достижения этого? Я довольно новичок в архитектуре MVC, Nhibernate, SHarp и т. Д., Поэтому любая помощь будет принята с благодарностью!

EDIT *

Хорошо, теперь я немного скорректировал свои занятия. Моя проблема заключалась в том, что я ожидал, что промежуточная таблица будет выведена. Вместо этого я понимаю, что должен создать это. Итак, теперь у меня есть (я немного упростила классы для удобства чтения.

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

Проблема с вышесказанным в том, что он все еще не включает внешний ключ для тега. Кроме того, должен ли он действительно иметь столбец идентификаторов, так как это реляционная таблица? Я думаю, это действительно составной ключ, состоящий из PK из таблиц Post и Tag.

Я уверен, что добавив в класс Tag

IList<PostTag> postList

Я получу еще один FK, добавленный в схему PostTag, но я не хочу добавлять вышеупомянутый, поскольку postList может быть огромным. Мне это не нужно каждый раз, когда я вношу сообщение в систему. У меня был бы отдельный запрос для расчета такого рода информации.

Может кто-нибудь помочь мне решить эту последнюю часть? Спасибо за ваше время.

1 Ответ

0 голосов
/ 28 сентября 2011

Хорошо, меня убедили, что моделирование составного класса в домене - это путь вперед, но я наконец-то наткнулся на небольшой код переопределения автоматического преобразования, который создает составную таблицу, и мне не нужно создавать для нее класс. Что я и ожидал в первую очередь:

открытый класс PostMappingOverride : IAutoMappingOverride { public void Override (карта AutoMapping) {

            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

Я думаю, что метатель заключается в том, что я искал отношения один-ко-многим, но это называется HasManytoMAny здесь ...

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