LINQ2SQL:更新具有对另一个实体的引用的实体字段

我在LINQ中有以下情况:我有一个对象(一个博客“Post”),它有一个“Status”字段,它可以采用不同的值,并且有一个列出所有这些值的表(这个表只有Id,Desc) 。结果 现在,由于创建了两个表之间的关系,因此在Model中,Post.Status不是int,而是“PostStatus”的实例。 因此,如果我想将Post的状态设置为20,我不能只将字段设置为20,我需要有一个PostStatus实例来分配。这些状态值都是用逻辑硬编码的,所以在我的代码中硬编码“20”就好了。
这有更好的方法吗?

switch (Action) {
 case "Ignore":
  post.PostStatus = (from s in db.PostStatus where s.Id == 90 select s).First();
  break;
 case "Assign":
  post.PostStatus = (from s in db.PostStatus where s.Id == 20 select s).First();
  break;
 case "MarkDone":
  post.PostStatus = (from s in db.PostStatus where s.Id == 30 select s).First();
  break;
 case "MarkPublished":
  post.PostStatus = (from s in db.PostStatus where s.Id == 40 select s).First();
  post.Public = true;
  break;
}
老实说,我讨厌这段代码,首先是因为它不必要地查询数据库以获取PostStatus实例,但主要是因为它只是如此冗长。
有一个更好的方法吗? 谢谢!点击 丹尼尔
已邀请:

ut_et

赞同来自:

听起来PostStatus或多或少都是枚举。我们一直通过在DB中创建一个相关表来做这样的事情(就像你一样),但是然后删除DBML中的关系并将子列上的CLR类型更改为枚举类型。枚举类型声明的值与父DB表中的行相同(在您的情况下,Assign = 20,MarkDone = 30等)。我编写了一个工具,从我们所有枚举的代码中填充表的值 - 这样代码就是“主”(如果有人试图改变现有值的值或名称,它就会爆炸,但新值“只是工作” )。现在,当你想做你正在做的事情时,你需要的数据已经在枚举中设置了Post.PostStatus = Action(假设你也将Action从一个字符串改为同一枚举类型) - 没有数据库打得必要。 我们还有一些更动态的 - 我们在应用启动时从数据库缓存一次并放入一个字典中,这样我们就可以设置ID而不会出现数据库命中。只要你不是在谈论数百万的价值观,那就非常有效。

要回复问题请先登录注册