for reason cannot head around one... have private messaging system allows users send eachother pm's. user can delete message his/her inbox, when happens, shouldn't deleted other user's inbox. that, believe should have many many relationship between user , message entities. but, how should map relationship allow users delete messages inbox (which thought i'd create boolean for: displayininbox) , not delete other user's inbox well?
my current model not work follows:
public class message { public int id { get; set; } [maxlength(150)] public string subject { get; set; } [maxlength(3000)] public string content { get; set; } public datetime datesent { get; set; } public datetime? lastviewed { get; set; } public bool isread { get; set; } public bool displayininbox { get; set; } public int? parentid { get; set; } }
and on user class have property:
public virtual icollection<message> receivedmessages { get; set; }
do need 2 booleans or 1 enough? , how should map relationship eventually?
update:
ok here's model:
public class inbox { [key, column(order = 0), foreignkey("user")] public int userid { get; set; } [key, column(order = 1), foreignkey("message")] public int messageid { get; set; } public datetime? lastviewed { get; set; } public bool isread { get; set; } public virtual message message { get; set; } public virtual user sender { get; set; } public virtual user receiver { get; set; } } public class message { public int id { get; set; } [maxlength(150)] public string subject { get; set; } [maxlength(3000)] public string content { get; set; } public datetime datesent { get; set; } public int? parentid { get; set; } public virtual icollection<inbox> receivedby { get; set; } public virtual icollection<inbox> sentby { get; set; } }
and on user class:
public virtual icollection<inbox> receivedmessages { get; set; }
you don't need boolean. meaning of boolean model many-to-many relationship. have message in database once , inbox presence defined many-to-many relation.
the problem want keep additional information related message , user. because of must expose junction table separate entity:
// message public class message { public int id { get; set; } [maxlength(150)] public string subject { get; set; } [maxlength(3000)] public string content { get; set; } public datetime datesent { get; set; } [foreignkey("parentmessage")] public int? parentid { get; set; } [foreignkey("sender")] public int senderid { get; set; } ... public virtual message parentmessage { get; set; } public virtual icollection<inbox> receivedby { get; set; } public virtual user sender { get; set; } } public class inbox { [key, column(order = 0), foreignkey("user")] public int userid { get; set; } [key, column(order = 1), foreignkey("message")] public int messageid { get; set; } public datetime? lastviewed { get; set; } public bool isread { get; set; } public virtual message message { get; set; } public virtual user user { get; set; } } public class user { public int id { get; set; } ... public virtual icollection<inbox> receivedmessages { get; set; } public virtual icollection<message> sendmessages { get; set; } }
now removing message user's inbox means removing record receivedmessages
not delete message - delete record in inbox
table.
edit:
i updated code sample support additional requirements. now:
- each
message
can have multiple receivers - receiving
message
done separate entity calledinbox
allow deleting message peruser
, using propertiesisread
peruser
. message
has optionalparentid
,parentmessage
can track reactions / responses other messages.message
hassender
,senderid
, in same timeuser
have collection of sent messages. in opinionmessage
sent singleuser
relation has nothinginbox
, must directly betweenmessage
,user
.
Comments
Post a Comment