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"}

现在,我想将文章对象类型从更改ArticleDetailedArticle保持属性不变(Id = 1 和 Name="ItemName")。
知道我正在使用EF5
这可能吗?如何 ?EF5 会检测类型更改吗?
在不可能的情况下有什么替代方案吗?

4

2 回答 2

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 约束的 (您无法删除articlethen),则它将不起作用。

我相信您唯一的解决方法是直接使用 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')");
    
于 2013-04-07T14:08:06.230 回答
1

只是为了补充已经很好的答案......

类型高度“植根”于代码优先,它如何存储、查询和物化对象。

identity使用时得到的最少TPH- 因为这些记录实际上仅在 Db 中“相差一个字段”值(它们使用同一个表)。仍然“在 C# 中”,你不能仅仅“重新布线”。

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

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

于 2013-04-07T17:08:32.430 回答