【问题标题】:EF CF - List<T> of Primitive TypeEF CF - 原始类型的列表<T>
【发布时间】:2016-08-27 17:12:02
【问题描述】:

我有以下几点:

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!

在任何人问之前 - 我们出于性能原因故意将其非规范化。

【问题讨论】:

  • 我能看到的唯一方法是覆盖 .Add() 方法并在其中调用 setter 或以相同的方式运行。

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


【解决方案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));
    }
}

当然这只是样本。

【讨论】:

  • 如果你不关心性能,你可以创建自己的列表 你这是什么意思?创建自己的列表有什么性能问题?
  • @IvanStoev 性能问题在Add 方法中。每个Add 调用都会创建新字符串。我相信可以缓冲或使其“懒惰”。
  • 我明白了。有道理。但是使用 get、add、assign 的 OP 当前注入要差得多。你的想法好多了,我喜欢它,只是对一开始的性能陈述感到好奇。 +1
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 2012-11-07
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多