我有以下内容:
public class Broadcast {
public int NumUsersToMessage { get; set; }
public int NumMessagesQueued { get; set; }
public string DbUsersMessaged { get; set; }
public int NumMessagesSent {
get {
return UsersMessaged.Count();
}
}
public List<int> UsersMessaged {
get {
return DbUsersMessaged == null ? new List<int>() : DbUsersMessaged.Split(',').Select(Int32.Parse).ToList();
}
set {
DbUsersMessaged = value != null ? String.Join(",", value) : null;
}
}
}
我的目标是只能通过DbUsersMessaged
访问UsersMessaged
。我正在尝试broadcast.UsersMessaged.Add(2)
,但由于这不是一项任务,我无法让财产按照我喜欢的方式行事。相反,我必须这样做:
tempList = broadcast.UsersMessaged();
tempList.Add(2);
broadcast.UsersMessaged = tempList;
db.SaveChanges();
这显然很笨重。我正在考虑制作一个AddReassign
扩展方法,但我想知道 - 这里支持原始类型列表的标准做法是什么?看起来即使使用扩展方法,我最好的镜头看起来像这样:
broadcast.UsersMessaged = broadcast.UsersMessaged.AddReassign(2) // yuck!
在有人要求之前 - 出于性能原因,我们故意将其非正规化。
答案 0 :(得分:1)
如果您不关心效果,可以创建自己的列表:
public class MyList : IList<int>
{
private List<int> underlyingList;
private Broadcast entity;
public MyList(Broadcast entity)
{
this.entity = entity;
this.underlyingList = entity.DbUsersMessaged?.Split(",") ?? new List<int>();
}
public void Add(int i)
{
this.underlyingList.Add(i);
this.entity.DbUsersMessaged = String.Join(",", underylingList);
}
// other interface memebers impl
}
然后
MyList list;
public IList<int> UsersMessaged {
get {
return myList ?? (myList = new MyList(this));
}
}
当然这只是样本。
答案 1 :(得分:0)
然后从字符串转换为列表,然后使用Saving Changes event在保存时转换回字符串构造。
然后,为了提高性能,您可能希望使用byte[]
而不是字符串来存储数据库中的数据。