2016-08-27 7 views
0

私は、次のしている:ここEF CF - プリミティブ型の一覧<T>

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! 

- 私たちは、パフォーマンス上の理由から、これを意図的に非正規化しました。

+0

私が見ることができる唯一の方法は、.Add()メソッドをオーバーライドしてsetterを呼び出すか、同じ方法で動作させることです。 – DevilSuichiro

答えて

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

を、それが唯一のサンプルです。

+0

*パフォーマンスを気にしない場合は、独自のリストを作成できます。*それはどういう意味ですか?自分のリストを作成する際のパフォーマンス上の問題は何ですか? –

+0

@IvanStoev perofrmanceの問題は 'Add'メソッドにあります。すべての 'Add'呼び出しは新しい文字列を作成します。私はバッファリングされるか、それを "怠け者"にすることができると信じています。 – pwas

+0

私は参照してください。意味をなさないしかし、get、add、assignでのOP電流注入ははるかに悪いです。あなたのアイデアははるかに良い、私はそれが好きだった、ちょうど最初のパフォーマンスステートメントに興味があった。 +1 –

0

私はこれを見て持っていることをお勧めします:Entity Framework 5 - Looking for Central Point to Execute Custom Code after Entity is Loaded from Database

をして、リストに文字列から変換して保存するときに、文字列の構築に戻って変換することSaving Changes eventを使用しています。

パフォーマンスのために、データベースにデータを格納するための文字列ではなく、byte[]を使用することもできます。