1

winforms アプリから注文を保存すると、正常に動作します。しかし、2 つ目を追加しようとすると、SaveChanges() メソッドが例外をスローします。

操作に失敗しました: 1 つ以上の外部キー プロパティが null 非許容であるため、リレーションシップを変更できませんでした。リレーションシップに変更が加えられると、関連する外部キー プロパティが null 値に設定されます。外部キーが null 値をサポートしていない場合は、新しい関係を定義するか、外部キー プロパティに別の非 null 値を割り当てるか、関連のないオブジェクトを削除する必要があります。

「Orders」テーブルと、外部キー OrderID を持つ「Orderlines」テーブルが 1 つあります。

なぜこれが起こるのか誰か知っていますか?

私のコンテキスト処理が理想的ではないことはわかっているので、それが問題である場合は、これを変更する方法についての提案をお待ちしています!

public class Orders
{
    private readonly DataContext _context;

    public Orders()
    {
        _context = EntityContext.Context;
    }

    public int Save(Order order)
    {
        if (order.ID > 0)
            _context.Entry(order).State = EntityState.Modified;
        else
        {
            _context.Orders.Add(order);
        } 
            _context.SaveChanges();
            return order.ID;
    }
}
public class EntityContext : IDisposable
{
    private static DataContext _context;
    public static DataContext Context
    {
        get
        {
            if (_context != null)
                return _context;
            return _context = new DataContext();
        }
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

EDIT 1例外時の注文クラスと注文のスクリーンキャプチャを追加しました

更新の整合性を CASCADE に設定しました。

Orderlines は関係テーブルです。

public partial class Order
{
    public Order()
    {
        this.Orderlines = new HashSet<Orderline>();
    }

    public int ID { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public int PaymentType { get; set; }
    public Nullable<int> SettlementID { get; set; }
    public Nullable<decimal> CashPayment { get; set; }
    public Nullable<decimal> BankPayment { get; set; }
    public Nullable<int> UserID { get; set; }

    public virtual ICollection<Orderline> Orderlines { get; set; }
    public virtual Settlement Settlement { get; set; }
}

例外時のオブジェクトの順序

EDIT 2 - 部分クラス

order オブジェクトと orderline オブジェクトを拡張する部分クラスがあります。

public partial class Order 
{
    public decimal Total
    {
        get { return Orderlines.Sum(x => x.Quantity*x.Price); }
    }
    public decimal TotalExMva
    {
        get { return Orderlines.Sum(x => (x.Quantity*x.Price)/(x.Vat + 1)); }
    }
    public decimal Mva
    {
        get { return Total - TotalExMva; }
    }

}

public partial class Orderline
{
    public decimal Total
    {
        get { return (Price*Quantity); }         
    }

    public string ProductName
    {

        get
        {
            var currentProductId = ProductID;
            return new Products().Get(currentProductId).Name;
        }
    }
}

EDIT 3 - オーダーラインと製品クラス

public partial class Orderline
{
    public int ID { get; set; }
    public int ProductID { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; }
    public decimal Vat { get; set; }
    public int OrderID { get; set; }

    public virtual Order Order { get; set; }
    public virtual Product Product { get; set; }
}
public partial class Product
{
    public Product()
    {
        this.Orderlines = new HashSet<Orderline>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string GTIN { get; set; }
    public decimal Price { get; set; }
    public decimal Vat { get; set; }

    public virtual ICollection<Orderline> Orderlines { get; set; }
}

Orderlines -> 例外の Orderline オブジェクト

4

1 に答える 1