2016-01-22 42 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