2014-12-03 2 views
0

Предположим, у меня есть класс ListingEvent и класс UserAccount.Servicestack OrmLite удаляет многие из многих

ListingEvent может иметь много UsersAttending и UserAccount может присутствовать много ListingEvents.

Классы похожи:

public class UserAccount 
{ 
    [AutoIncrement] 
    [PrimaryKey] 
    public int Id { 
     get ; 
     set; 
    } 

    public string Name { 
     get ; 
     set; 
    } 

    public UserAccount() 
    { 
     ListingEventsAttending = new List<UserAccountListingEvent>(); 
    } 

    [Reference] 
    public List<UserAccountListingEvent> ListingEventsAttending { 
     get; 
     set; 
    } 
} 

public class UserAccountListingEvent{ 
    [AutoIncrement] 
    [PrimaryKey] 
    public int Id { 
     get; 
     set; 
    } 

    public Model.AttendingStatus Status { get; set; } 

    [References(typeof(UserAccount))] 
    public int UserAccountId { 
     get; 
     set; 
    } 

    [References(typeof(ListingEvent))] 
    public int ListingEventId { 
     get; 
     set; 
    } 
} 

public class ListingEvent 
{ 
    public ListingEvent() 
    { 
     UsersAttending = new List<UserAccountListingEvent>(); 
    } 

    [AutoIncrement] 
    [PrimaryKey] 
    public int Id { 
     get ; 
     set; 
    } 

    public string Name { get; set; } 

    [Reference] 
    public List<UserAccountListingEvent> UsersAttending { get; set; } 

    public void RemoveUserAttending(UserAccount user) 
    { 
     if (user == null) 
     { 
      return; 
     } 

     UsersAttending.RemoveAll(u => u.UserAccountId == user.Id); 
    } 
} 

И я получаю ListingEvent, который имеет мой учетная_запись_пользователя посещение с:

var listingEvent = db.LoadSingleById<Model.ListingEvent> (request.Id); 

И я вижу, что пользователь с правильным Id посещает так называют RemoveUserAttending, чтобы удалить пользователя. Теперь я могу видеть пользователь не посещает, так что я называю:

db.Save (listingEvent, references: true); 

Но - теперь, когда я иду, чтобы принести что ListingEvent пользователь вновь возвращается к посещению.

Так что мой вопрос:

  1. следует выше работы, как ожидалось?
  2. если нет - как я должен это делать?

ответ

0

db.Save() только INSERT или UPDATE сущности, т.е. он не DELETE их.

Чтобы удалить, получить идентификаторы сущностей или сущностей, которые вы хотите удалить, и использовать API db.Delete* OrmLite явно, например. что-то вроде:

var removeUsersAttendingIds = listingEvent.UsersAttending 
    .Where(u => u.UserAccountId == user.Id) 
    .Select(u => u.Id); 

db.DeleteByIds<UserAccountListingEvent>(removeUsersAttendingIds); 
+0

Это немного проблема, потому что теперь мне нужно вывести эту логику из своего домена, которая оставит его немного анемичным - как люди справляются с этим? Должен ли я рассматривать oRM, который отслеживает изменения? :/ – iwayneo

+0

OrmLite всегда была неудивительной ORM, которая сохраняет высокое сродство к SQL, т. Е. Вам потребуется очень похожий подход с SQL или любым Micro ORM. Если вы вместо этого восполняете его (т. Е. Не укажете тип [Reference]), то ваш подход будет работать. В противном случае вы можете использовать более тяжелую ORM с отслеживанием изменений, если хотите. – mythz

+0

Cheers - собираешься шипнуть какой-то код - не используется NHibernate в течение долгого времени: p – iwayneo

 Смежные вопросы

  • Нет связанных вопросов^_^