将对象类型更改为继承自相同类类型并保持根属性设置的另一个类型

时间:2013-04-07 13:47:22

标签: c# entity-framework type-conversion entity-framework-5

我有两个课程如下:

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会检测到类型变化吗? 在不可能的情况下有任何替代方案吗?

2 个答案:

答案 0 :(得分: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值)或者如果您有其他实体引用带有FK约束的article,那么它将无效(您可以' t删除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 :(得分:1)

只是添加已经很好的答案......

  

类型高度“扎根”代码优先,它如何存储,查询   并实现对象。

使用identity时得到的TPH最少 - 因为这些记录实际上只有Db中的“一个字段”值(他们使用相同的表格) )。仍然“在C#中”你只能做'重新连接'。

所以,如果你觉得你需要那个(假设你还没有投入生产),那么最好将继承设置为TPH(就像你现在已经拥有的那样,如果这就是整个事情) - 并且直接做到直接SQL来“调整”该字段。无论看起来有多脏,它仍然是最简单的解决方案。

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