2016-05-03 14 views
2

私のServiceStackアプリケーションでは、2人のユーザーがダイアログを持つことができるシンプルなチャットを実装しています。簡単にするために、私は次のフィールドが含まれていTextMessagesテーブルを、作成しました:ServiceStack同じタイプの負荷を複数参照する

public class TextMessage 
{ 
    [AutoIncrement] 
    [PrimaryKey] 
    public int Id { get; set; } 

    [References(typeof(MyUserAuth))] 
    public int FromUserId { get; set; } 

    [References(typeof(MyUserAuth))] 
    public int ToUserId { get; set; } 

    [Reference] 
    [ForeignKey(typeof(MyUserAuth))] 
    public MyUserAuth FromUser { get; set; } 

    [Reference] 
    [ForeignKey(typeof(MyUserAuth))] 
    public MyUserAuth ToUser { get; set; } 

    //TimeZoneInfo.ConvertTimeToUtc(dateNow); 
    public DateTime UtcReceivedOn { get; set; } 

    public string Text { get; set; } 
} 

私USERAUTHは、ベース1を継承し、2つの以上のフィールド追加:

public class MyUserAuth : UserAuth 
{ 
    public List<TextMessage> TextMessagesAsAuthor { get; set; } 

    public List<TextMessage> TextMessagesAsRecipient { get; set; } 
} 

は、今の私はいくつかを作成しましょうユーザーその後、いくつかのメッセージ:

var msg1 = new TextMessage { FromUserId = 1, ToUserId = 2, UtcReceivedOn = dt, Text = "Hello" }; 
var msg2 = new TextMessage { FromUserId = 1, ToUserId = 3, UtcReceivedOn = dt, Text = "Hello" }; 
var msg3 = new TextMessage { FromUserId = 1, ToUserId = 4, UtcReceivedOn = dt, Text = "Hello" }; 
var msg4 = new TextMessage { FromUserId = 1, ToUserId = 4, UtcReceivedOn = dt, Text = "Hello" }; 

そして、私は私のユーザーを読み取ろう:

var user = db.LoadSingleById<MyUserAuth>(1); 

ここでの問題は、TextMessagesAsAuthorTextMessagesAsRecipientの両方に4つのメッセージがあり、論理的にはTextMessagesAsAuthorには4、TextMessagesAsRecipientには4があることです。 OrmLiteにこれらの2つの特性を異ならせるように私はどのように指示できますか?あなたはTextMessage表で使用しているよう

答えて

4

OrmLiteだけでは、複数の1をサポートしていない、multiple 1:1 Self Referencesをサポートしています。あなたのようなM外部参照がオンに宣言しようとしている:

public class MyUserAuth : UserAuth 
{ 
    public List<TextMessage> TextMessagesAsAuthor { get; set; } 

    public List<TextMessage> TextMessagesAsRecipient { get; set; } 
} 

も複雑に注意してください。 [Reference]属性を持たないプロパティは、それらの行に囲まれています。これはあなたがここで必要なものではありません。

またOrmLiteのPOCO References only load 1-level deep、すなわち参照は、再帰的にダウンしていないし、同様に参照されるテーブルの参照をロードするか、またはあなたがしようとしているように見えるものです任意の周期的な後方参照を取り込みます。

var msg1 = db.LoadSingleById<TextMessage>(1); 
msg1.PrintDump(); //prints populated FromUser/ToUser properties 

しかし、あなたのことができるように文句を言わない:例えば、

あなたは彼らの複数の自己ユーザーの参照をロードするために使用することができます
var msgs = new[] 
{ 
    new TextMessage { FromUserId = 1, ToUserId = 2, Text = "msg #1" }, 
    new TextMessage { FromUserId = 1, ToUserId = 3, Text = "msg #2" }, 
    new TextMessage { FromUserId = 1, ToUserId = 4, Text = "msg #3" }, 
    new TextMessage { FromUserId = 1, ToUserId = 4, Text = "msg #4" }, 
}; 
db.InsertAll(msgs); 

を:

だから彼らがそうであるように私は、テキストメッセージを維持したいですMyUserAuth複数の1:M外部参照についても同じ操作を行います。この場合、例えば、私はまだMyUserAuthテーブルにTextMessageコレクションを追加するだろうが、あなたは[Ignore]属性で行うことができますMyUserAuthテーブルを作成するときにそれらを無視するOrmLiteをお伝えしたいと思います:あなたはどちら

public class MyUserAuth : UserAuth 
{ 
    [Ignore] 
    public List<TextMessage> TextMessagesAsAuthor { get; set; } 

    [Ignore] 
    public List<TextMessage> TextMessagesAsRecipient { get; set; } 
} 

を手動で入力することができます。

var user1 = db.SingleById<MyUserAuth>(1); 
user1.TextMessagesAsAuthor = db.Select<TextMessage>(x => x.FromUserId == 1); 
user1.TextMessagesAsRecipient = db.Select<TextMessage>(x => x.ToUserId == 1); 
user1.PrintDump(); //prints populated MyUserAuth TextMessages 
関連する問題