实体框架一对多删除关系

时间:2012-03-08 22:11:23

标签: c# entity-framework one-to-many

我有两个实体TransactionDiscountType

交易:

public class Transaction
{
    [Key]
    public int TransactionID { get; set; }
    public virtual DiscountType DiscountType { get; set; }
}

DiscountType:

public class DiscountType
{
    [Key]
    public int DiscountTypeID { get; set; }
    public virtual ICollection<Transaction> Transactions { get; set; }
    public float DiscountValue { get; set; }
    public bool Enabled {get; set;}
}

关系:

 modelBuilder.Entity<DiscountType>().HasMany(d => d.Transactions);

目的:

我试图删除Transaction和DiscountType之间的关系,而不实际删除任何一个实体。

问题:

现在我没有问题为交易分配折扣,但是当我执行以下操作时:

 var transaction = context.Transactions.Where(t => t.TransactionID == 1).First();
 transaction.DiscountType = context.DiscountTypes.Where(d => d.DiscountTypeID == 1).First();
 context.SaveChanges();


 var _transaction = context.Transactions.Where(t => t.TransactionID == 1).First();
 _transaction.DiscountType = null;
 context.SaveChanges();

这是我遇到的一个特殊问题。运行此代码时,它不会删除两者之间的关系。

实际代码:

As you can see, even after the <code>= null;</code> is executed, it still remains.

正如您所看到的,即使执行= null;之后,它仍然存在。

2 个答案:

答案 0 :(得分:0)

我认为您的select语句可能需要:

transaction.DiscountType = 
  context.DiscountTypes.Where(d => d.DiscountTypeID == 1).SingleOrDefault();

答案 1 :(得分:0)

我认为你最好在创建DbContext

时改变关系
modelBuilder.Entity<Transaction>()
    .HasOptional(x => x.DiscountType)
    .WithOptionalPrincipal();

这会在Transaction中为DiscountType创建一个可以为空的外键,我认为它允许您将其设置为null

(就我个人而言,我认为这是一种更好的方式,因为语义上对于“拥有”交易的类型来说似乎很奇怪,但是具有类型的交易是很正常的。)