当我们有继承时,在1对多关系中保存多个对象时的实体框架异常

时间:2013-09-24 13:41:39

标签: c# entity-framework ado.net

我创建了一个非常简单的测试模型,但我遇到了一个问题。

如果我的关系为1到多,则关系为1 - 0 ... 1。如果我创建了多个对象以添加到1到多侧的模型,我会得到以下异常:

Unable to determine the principal end of the 
'TestModel.FK__Transacti__Trans__023D5A04' relationship. 
Multiple added entities may have the same primary key.

这是我正在处理的模型:

enter image description here

我用来进行保存的实体框架代码如下:

using (TestEntities context = new TestEntities())
        {
            // create test sales 
            SalesOrderHeader salesHeader = new SalesOrderHeader();
            salesHeader.Transactions = new List<Transaction>();
            salesHeader.SalesDate = DateTime.Now;

            // create test payment
            TransactionPayment payment = new TransactionPayment();
            payment.SalesOrderHeader = salesHeader;
            payment.TransactionDate = DateTime.Now;

            // attach the payment to the sale
            salesHeader.Transactions.Add(payment);

            // create another test payment
            payment = new TransactionPayment();
            payment.SalesOrderHeader = salesHeader;
            payment.TransactionDate = DateTime.Now;

            // attach the 2nd payment to the sale
            salesHeader.Transactions.Add(payment);

            // add the sale to the context and save the changes
            context.SalesOrderHeaders.AddObject(salesHeader);
            context.SaveChanges();
        }

该模型基本上读取,我们有1个销售标题。对于每个销售标题,我们有多个交易对象。并且每个交易对象可以是交易支付类型。忽略这个模型的简单性,它是我正在尝试做的一个主要减少的版本,但它遇到了与真实模型完全相同的异常。

因此,交易支付继承自交易,我已经删除了交易支付的主键,因为它与交易密钥冲突,即“TransactionID”列。

如果我一次保存一个交易,它将起作用。如果我手动将交易ID设置为两个支付对象上的不同数字,则它可以正常工作。但是,如果我没有设置密钥,我会得到该异常。 ID字段是DB中的自动递增数字,所以我不应该将键设置为某个虚数,然后在保存后会被覆盖?

我做错了吗?

1 个答案:

答案 0 :(得分:1)

您应该删除图表中的0 - 0..1关系。它由您添加的继承替换。请注意,没有相应的Nav属性。

事实证明这是实际错误。