2013-04-07 27 views
2

我有两个类,如下所示:更改对象类型到另从相同类型的类继承与保留根属性中设置

class Article 
{ 
public int Id {get;set;} 
public string Name {get;set;} 
} 

class DetailedArticle : Article 
{ 
    public string SerialNumber {get;set;} 
} 

我没有创建这样的文章:

var article = new Article {Id=1, Name="ItemName"} 

现在,我想将文章对象类型从Article更改为DetailedArticle,同时保留属性(Id = 1和Name =“ItemName”)。
知道我正在使用EF5
这可能吗?怎么样 ? EF5会检测类型更改吗?
不可能的情况下的任何替代方案?

+0

你不能*把'文章'改成'详细文章'。您可以创建另一个与Article Article具有相同属性的'DetailedArticle'对象。 – 2013-04-07 13:51:24

+0

我知道直接的类型转换不能完成。 C#不是一种动态语言。尽管试图找到一些隐含的转换或任何C#专家发现这个特定问题的解决方法。 – HichemSeeSharp 2013-04-07 14:07:26

回答

1

我提出了直接的方式:

var article = context.Articles.Find(1); 
context.Articles.Remove(article); 
var detailedArticle = new DetailedArticle 
{ 
    Id = article.Id, 
    Name = article.Name, 
    SerialNumber = "ABC" 
}; 
context.Articles.Add(detailedArticle); 
context.SaveChanges(); 

如果Id是一个自动生成的身份将无法正常工作(你会得到一个新的ID值),或者如果你有其他实体指的的article与FK约束(然后您不能删除article)。

我相信你的唯一的解决方法,然后将直接使用SQL:

  • 对于TPH继承:

    context.Database.ExecuteSqlCommand(
        @"UPDATE Articles SET SerialNumber = N'xyz', 
              Discriminator = N'DetailedArticle' WHERE Id = 1"); 
    
  • 对于TPT继承:

    context.Database.ExecuteSqlCommand(
        @"INSERT INTO DetailedArticles VALUES (1, N'xyz')"); 
    
1

刚添加已经很棒的回答呃...

类型高度'扎根'到代码优先,它如何存储,查询 和物化对象。

最低identity您使用TPH时获得 - 作为这些记录实际上仅相差“由一个领域的价值在DB(他们使用的是同一个表)。仍然'在C#'你不能做很多只是'重新布线'。所以,如果你觉得你会需要(假设你还没有在生产中),最好的办法就是将继承设置为TPH(就像你现在已经拥有了,如果这就是整个事物) - 并且只是做直接SQL来'调整'该字段。无论看起来多么肮脏,它仍然是最简单的解决方案。

接下来会是 - 加载旧的 - 记住它的所有关联,相关记录 - 删除它 - 再次添加新的 - 这可能不是很有趣。