2016-01-22 46 views
0

我正在使用實體框架6版本。 我有這樣的關係EF不跟蹤enherited類型的更改

public class Maintenance { 
    [Key, ForeignKey("Configuration")] 
    public int Id {get;set;} 
    public string Text {get;set;} 
    public Configuration Configuration {get;set;} 
} 

public abstract class Configuration { 
[Key] 
public int Id{get;set;} 
public Maintenance Maintenance {get;set;} 
} 

配置類實際上是多種類型的配置

爲前基本類。 SimpleConfiguration:配置{...} ComplexConfiguration:配置{...} e.t.c. 爲enheritance的EF映射是這樣的:

Map<SimpleConfiguration>(x => x.Requires("Type").HasValue(0)); 
Map<ComplexConfiguration>(x => x.Requires("Type").HasValue(1)); 

所以當我創建一個新的配置並保存_db.SaveChanges() - 一切工作正常。前者爲 。

var maintenance = db.Maintenance.Find(maintenanceId); 
maintenance.Configuration = new SimpleConfiguration(); 
db.SaveChages(); 

,但是當我試圖更新現有的配置

maintenance.Configuration = new ComplexConfiguration(); 
db.SaveChanges(); 

不會在所有的工作。此外,我已經tryed

maintenance.Configuration = null; 
maintenance.Configuration = new ComplexConfiguration(); 
db.SaveChanges(); 

什麼...

至少我已經找到了解決方案

var config = db.Configurations.Find(configId); 
db.Configurations.Remove(config); 
db.SaveChanges(); 

maintenance.Configuration = new ComplexConfiguration(); 
db.SaveChanges(); 

所以我應該兩次修正變化。但我想知道EF不檢查Type是否改變配置。一些想法?

回答

0

在EF中,如果現有實體的類型已創建,則無法更改其類型,如here所述。因此,如果您需要用另一個配置替換一個配置,您需要刪除並創建,就像您正在做的那樣。

+0

thnx爲答案,創建SP轉換這是一個好主意 – Andriy

+0

很高興它是有用的。其實我不喜歡sp選項,但這取決於你。請不要忘記標記爲已解決!有問題 – tede24

+0

有時SP可能真的有助於提高性能。無論如何,thnx的幫助:) – Andriy