4

使用下面的代码,假设我有 5 种不同的类型,我可能会在变量类型中收到这些类型。除了编写 5 个条件语句之外,有没有办法编写一个并使用变量“type”来指示模型是什么,在本例中为“CommentVote”?或者这更多是我设计数据模型的方式的缺陷,这五件事中的每一个都有一个“投票”模型?

 if (type == "comment")
 {
      CommentVote voteObj = db.CommentVotes
           .Where(x => x.UserID == UserID && x.CommentID == id)
           .SingleOrDefault();
      if (voteObj != null)
      {
          voteObj.Vote = vote;
          db.SaveChanges();
      }
      else
      {
          CommentVote c = new CommentVote { 
               CommentID = id, UserID = UserID, Vote = vote, DateCreated = DateTime.Now 
          };
          db.CommentVotes.Add(c);
          db.SaveChanges();
      }

      count = (db.CommentVotes.Count(x => x.CommentID == id && x.Vote == true) - db.CommentVotes.Count(x => x.CommentID == id && x.Vote == false));
 }

魔术代码:我想做的事情。

 var modelName = "";
 var modelOtherName = "";
 if (type == "comment") {
      modelName = CommentVote;
      modelOtherName = CommentVotes;
 }

      modelName voteObj = db.modelOtherName
           .Where(x => x.UserID == UserID && x.CommentID == id)
           .SingleOrDefault();

更新:我开始认为我的模型可能是基于下面引用的一些阅读的废话。所以我把其中的一些作为参考。让我知道这是否是我应该尝试解决的问题。

 public class CommentVote
 {
    public int CommentVoteID { get; set; }
    public bool Vote { get; set; }
    public DateTime DateCreated { get; set; }
    public int UserID { get; set; }
    public virtual User User { get; set; } 

    public int CommentID { get; set; }  //This row changes from model to model
    public virtual Comment Comment { get; set; }  //This row changes from model to model
 }

我有一些几乎相同的模型。

4

3 回答 3

2

据我了解您的问题,它更多与数据库架构相关。

如果这些投票彼此之间没有太大区别(就属性而言),我不会为它们使用不同的表格。而是创建一个带有 Type 列的 Vote 表和(如您提供的示例中)CommentID 的可为空列。

然后您可以使用类继承来反映您的投票(Vote 基类和 CommentedVote 子类)。

实体框架中按层次结构继承的表

更新: 最好不要在所有类中重复相同的属性。您只需像这样使用 inharitence :

 public abstract class Vote
 {
    public int VoteID { get; set; }
    public bool isVote { get; set; }
    public DateTime DateCreated { get; set; }
    public int UserID { get; set; }
    public virtual User User { get; set; } 

    public int VoteType { get; set;} //this property specifies type of vote (e.g. VoteType=1 for CommentedVote )
 } 
 public class CommentVote : Vote
 {
    public int CommentID { get; set; }  
    public virtual Comment Comment { get; set; }  
 }
 public class OtherVote : Vote
 {
    public int OtherID { get; set; }  
    public virtual Other Other { get; set; }  
 }

这篇非常好的博客文章中,您可以找到所有可能的方法。我正在写的一个叫做 Table per Hierarchy (TPH)。

于 2013-01-09T18:47:23.823 回答
1

假设您执行相同的操作并设置相同的数据,您绝对可以将代码简化为单个语句。在这种情况下,您应该有一个包含常用操作和数据的接口以及一个对象工厂,以根据类型实例化正确的对象。

于 2013-01-09T18:50:07.980 回答
0

如果您使用反射实现工厂模式,您可以做到这一点,这里显示了一个非常基本的示例。

简而言之,您所做的是:由于您可能有 5 种不同的类型,因此您将创建 5 个不同的类,每个类都实现特定的接口。然后,您创建工厂类以使用反射来获取最适合您的情况的类(无论是使用直截了当的类名,如示例中,还是使用类上的 Attribute,如here)。工厂返回该接口的一个实例,然后您只需从该接口调用公开的方法即可为您完成所有这些工作。

最好的部分是,如果您需要创建另一种类型,您所要做的就是添加另一个具有您将在工厂中搜索的属性/名称的类。您的其他代码都不需要受到影响,从而使您符合开放/封闭原则。

于 2013-01-09T18:49:09.020 回答