1

当我从我的 winforms 应用程序保存订单时,它工作正常。但是当我尝试添加第二个时, SaveChanges() 方法会引发异常:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

我有一个表“Orders”和一个具有外键 OrderID 的“Orderlines”。

有谁知道为什么会这样?

我知道我的上下文处理并不理想,所以如果这是问题所在,任何关于如何改变它的建议都会非常有帮助!

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

编辑 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; }
}

异常的对象顺序

编辑 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;
        }
    }
}

编辑 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

-1

这在这个博客中有很好的描述:http: //blogs.msdn.com/b/dsimmons/archive/2010/01/31/deleting-foreign-key-relationships-in-ef4.aspx

并且是一个称为识别关系的问题:http: //msdn.microsoft.com/en-us/library/vstudio/ee373856 (v=vs.100).aspx

特雷克斯

于 2013-10-17T08:26:46.550 回答