0

次のエンティティを検討してください

public class Supplier
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Product> Products { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Category { get; set; }  

    public int? SupplierId { get; set; }
    public virtual Supplier Supplier { get; set; }
}

上記のコードに従って、サプライヤー エンティティは 0 個以上の製品を持つことができます。上記のエンティティでは、ID は Entity Framework によって自動生成されます。

Odata V4 クライアント コード ジェネレーターを使用しています。

クライアントコード:

Supplier s = new Supplier{...}
OdataContext.AddToSuppliers(s);

Product p = new Product{...}
p.SupplierId = s.Id;
OdataContext.AddToProduct (p);

OdataContext.SaveChanges();

サプライヤー管理者:

public async Task<IHttpActionResult> Post(Supplier supplier)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    db.Supplier.Add(supplier);
    await db.SaveChangesAsync();
    return Created(supplier);
}

製品コントローラー:

public async Task<IHttpActionResult> Post(Product product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    db.Products.Add(product);
    await db.SaveChangesAsync();
    return Created(product);
}

変更を保存すると、次のエラー メッセージが表示されます。

INSERT ステートメントが FOREIGN KEY 制約と競合しました。

エラーの理由は、ProductエンティティがSupplierIdデータベースで生成されたキーをまだ持っていないためです。

では、レコードを保存しながらエンティティに追加SupplierIdするにはどうすればよいでしょうか? Product誰でもこの問題を解決するのを手伝ってもらえますか?

4

3 に答える 3

0

OData クライアントはまだ深い挿入をサポートしていないと思います。したがって、別のオプションは、以下のように、要求本文に WebClient と JSON シリアライザーを使用することです。親エンティティと子エンティティの両方が単一の http リクエストで作成され、それに応じて外部キーが更新されます -

var product = new ProductService.Models.Product()
        {
            Name = "My Car",
            Category = "Auto",
            Price = 4.85M
        };

        var supplier = new ProductService.Models.Supplier()
        {
            Name = "My Name"
        };

        //Add product to supplier
        supplier.Products.Add(product);

        WebClient client = new WebClient();
        client.BaseAddress = "http://example.com/OData";
        client.Headers.Add("Content-Type", "application/json");

        //Serialize supplier object
        var serializer = new JavaScriptSerializer();
        var serializedResult = serializer.Serialize(supplier);

        //Call the service
        var result = client.UploadString("http://example.com/OData/Suppliers", serializedResult.ToString());

仕入先コントローラでのポスト アクション -

public async Task<IHttpActionResult> Post(Supplier supplier)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        db.Suppliers.Add(supplier);
        await db.SaveChangesAsync();
        return Created(supplier);
    }
于 2016-02-25T19:31:30.033 に答える