EF CF - List原始类型

本文关键字:原始 类型 CF List EF | 更新日期: 2023-09-27 18:04:24

我有以下内容:

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

我的目标是只通过UsersMessaged访问DbUsersMessaged。我试图做broadcast.UsersMessaged.Add(2),然而,因为这不是一个分配,我不能得到属性的行为,因为我喜欢。相反,我必须这样做:

 tempList = broadcast.UsersMessaged();
 tempList.Add(2);
 broadcast.UsersMessaged = tempList;
 db.SaveChanges();

这显然是笨拙的。我正在考虑制作一个AddReassign扩展方法,但我想知道—这里支持基本类型列表的标准实践是什么?看起来,即使使用扩展方法,我最好的镜头看起来像这样:

 broadcast.UsersMessaged = broadcast.UsersMessaged.AddReassign(2) // yuck!

在没有人问之前-出于性能原因,我们有意对其进行了非规范化。

EF CF - List<T>原始类型

如果你不关心性能,你可以创建自己的列表:

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

当然这只是样品。

我建议你看看这个:实体框架5 -寻找中心点执行自定义代码实体从数据库加载后

然后从字符串转换为列表,然后在保存时使用save Changes事件将其转换回字符串结构。

然后,为了性能,也许您想使用byte[]而不是字符串来存储数据库中的数据。