2012-03-08 169 views
0

我有兩個實體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); 

目的:

我試圖刪除事務和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;甚至後,它仍然存在。

+0

我是粉絲這些類型的關係的外鍵。 – 2012-03-08 22:21:17

+0

請詳細說明。我是EF新手。 – gunwin 2012-03-08 22:31:30

+0

您是否試過讓您的DiscountType(通過上下文),然後調用DiscountType.Transactions上的.Remove(yourtransaction)?我必須爲EF執行此操作,因爲SaveChanges無法識別關係的更改 - 只有標量值發生更改。 – JasCav 2012-03-08 23:32:53

回答

0

我覺得你的SELECT語句可能需要:

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

爲了演示目的,我寫了這個。重點是,它在創建關係時起作用。但刪除它時不會。 – gunwin 2012-03-08 22:25:20

0

我想你最好反轉在創建DbContext的關係:

modelBuilder.Entity<Transaction>() 
    .HasOptional(x => x.DiscountType) 
    .WithOptionalPrincipal(); 

這將創建一個空的外鍵DiscountType在交易中,我認爲它將允許您將其設置爲null

(我個人認爲這是把它的一個更好的辦法,因爲它的語義似乎不可思議的類型爲「有」的交易,但有一種類型的事務是很正常的。)