EF CF - 列出原始类型的<t>

时间:2016-08-27 17:12:02

标签: c# .net entity-framework ef-code-first

我有以下内容:

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!

在有人要求之前 - 出于性能原因,我们故意将其非正规化。

2 个答案:

答案 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)

我建议你看一下:Entity Framework 5 - Looking for Central Point to Execute Custom Code after Entity is Loaded from Database

然后从字符串转换为列表,然后使用Saving Changes event在保存时转换回字符串构造。

然后,为了提高性能,您可能希望使用byte[]而不是字符串来存储数据库中的数据。