我有两个课程如下:
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 :(得分: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
来“调整”该字段。无论看起来有多脏,它仍然是最简单的解决方案。
接下来是 - 加载旧的 - 记住它的所有关联,相关记录 - 删除它 - 再次添加新的 - 这可能也不是很有趣。