1

Simple.Data を使った最初の日です。純粋な ADO .NET からプロジェクトを移行しています。

列を持つ Order テーブルがあります。

Id
CreationDate
CustomerId  -> FK to Customer table

そして、私のプロジェクトの Order クラス:

int Id
DateTime CreationDate    
Customer Customer

私がやっているデータベースに新しい注文を挿入するには:

var newOrder=...
_db.Orders.Insert(new {
                       CreationDate=newOrder.CreationDate,
                       CustomerId = newOrder.Customer.Id
                      }
                 );

もっと簡単にすることは可能ですか?私にとってより単純なのは、新しい匿名オブジェクトを作成して各プロパティ値をコピーしないことを意味します。Simple.Data が挿入付きの暗黙的なキャストを提供することは知っていますが、これを試しているとき:

var newOrder=...
_db.Orders.Insert(newOrder);

SqlServer から「CustomerId を NULL にすることはできません」という例外が発生します。

4

2 に答える 2

1

現時点では可能ではないと思いますが、Mark はv2 で「実際に可能であれば、1 回の呼び出しでオブジェクト グラフを保存できるようにする」ことを検討しています(彼のブログ投稿を参照してください: http://blog.markrendle.net /2013/09/18/simple-data-2-0/、特に「Better WithStuff」段落)。

ただし、「newOrder」オブジェクトを動的に変換し、次のように「CustomerId」値を単純に「追加」することで、各プロパティ値のコピーを回避できます。

var d = newOrder.ToDynamic();
d.CustomerId = newOrder.Customer.Id;
_db.Orders.Insert(d);

ここで、「ToDynamic()」は単純な拡張メソッドです。

public static dynamic ToDynamic(this object @this)
{
    IDictionary<string, object> expando = new ExpandoObject();

    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(@this.GetType()))
    {
        expando.Add(property.Name, property.GetValue(@this));
    }

    return expando as ExpandoObject;
}

基になるテーブルにはこのための列がないため、Simple.Data は挿入時に元の "Customer" プロパティを無視します。

于 2013-10-01T06:12:17.260 に答える
0

顧客 ID を null にすることはできません。CustomerId が null の場合、データベースにデータを挿入しないロジックが必要です。

if (newOrder.Customer != null && newOrder.Customer.Id != null)
{
    _db.Orders.Insert(new 
    {
         CreationDate=newOrder.CreationDate,
         CustomerId = newOrder.Customer.Id
    });
}
于 2013-09-23T14:58:32.260 に答える