Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Orm 奥默斯,你将如何用奥默斯的方式处理这个问题?_Orm_Relationship - Fatal编程技术网

Orm 奥默斯,你将如何用奥默斯的方式处理这个问题?

Orm 奥默斯,你将如何用奥默斯的方式处理这个问题?,orm,relationship,Orm,Relationship,我们正在修改关于stackoverflow的帖子 我们只更改了标记部分,删除了tag1,tag2,并添加了tag3,tag4 按下“发布您的问题”按钮后,应执行以下操作: 将tag1,tag2的count列减少1 删除post与tag1,tag2 如果tag3,tag4已经存在,则将这两个变量的count列增加1;否则,使用count值1将它们插入到标记表中 添加post与tag3,tag4 让我们深呼吸,就这样 我想看看哪种ORM最容易/性能最好,无论它是用PHP/Java/C/.Net还是其

我们正在修改关于stackoverflow的帖子

我们只更改了标记部分,删除了
tag1
tag2
,并添加了
tag3
tag4

按下“发布您的问题”按钮后,应执行以下操作:

  • tag1
    tag2
    count
    列减少1
  • 删除post与
    tag1
    tag2
  • 如果
    tag3
    tag4
    已经存在,则将这两个变量的
    count
    列增加1;否则,使用
    count
    值1将它们插入到
    标记
    表中
  • 添加post与
    tag3
    tag4
  • 让我们深呼吸,就这样

    我想看看哪种ORM最容易/性能最好,无论它是用PHP/Java/C/.Net还是其他任何语言编写的,因为不同语言的想法都是相似的

    在它里面看起来是这样的。现在有了任何映射文件,因为数据库模式是由ORM自动生成的,包括问号关系的辅助表

    标记类:

    [HierachyRoot]
    public class Tag : Entity
    {
      [Field, Key]
      public int Id { get; private set; }
    
      [Field(Length = 100, Indexed = true)]
      public string Name { get; private set; }
    
      [Field]
      public int QuestionsCount { get; set; }
    
      public Tag(string name) 
      {
        Name = name;
      }
    }
    
    问题类别:

    [HierachyRoot]
    public class Question : Entity
    {
      [Field, Key]
      public int Id { get; private set; }
    
      [Field]
      public EntitySet<Tag> Tags { get; private set; }
    
      // Business methods (can be placed in separate service class)
    
      public void AddTag(string name)
      {
        var tag = Query.All<Tag>().SingleOrDefault(t => t.Name == name);
        if (tag==null)
          tag = new Tag(name) { QuestionsCount = 1 }
        else
          tag.QuestionsCount++;
        Tags.Add(tag);
      }
    
      public void RemoveTag(string name)
      {
        var tag = Query.All<Tag>.Single(t => t.Name == name);
        tag.QuestionsCount--;
        Tags.Remove(tag);
      }
    }
    
    [HierachyRoot]
    公共类问题:实体
    {
    [字段,键]
    public int Id{get;private set;}
    [现场]
    公共EntitySet标记{get;private set;}
    //业务方法(可以放在单独的服务类中)
    public void AddTag(字符串名称)
    {
    var tag=Query.All().SingleOrDefault(t=>t.Name==Name);
    if(标记==null)
    标记=新标记(名称){QuestionsCount=1}
    其他的
    tag.questionScont++;
    标签。添加(标签);
    }
    public void RemoveTag(字符串名称)
    {
    var tag=Query.All.Single(t=>t.Name==Name);
    tag.questionscont--;
    标签。移除(标签);
    }
    }
    
    申请代码:

    using (Session.Open())
    using (var transactionScope = Transaction.Open())
    {
      var question = Query.Single<Question>(questionId);
    
      question.RemoveTag("tag1");
      question.RemoveTag("tag2");
    
      question.AddTag("tag3");
      question.AddTag("tag4");
    
      transactionScope.Complete();
    }
    
    使用(Session.Open())
    使用(var transactionScope=Transaction.Open())
    {
    var question=Query.Single(questionId);
    问题:移除标记(“tag1”);
    问题:移除标记(“tag2”);
    问题。添加标签(“tag3”);
    问题。添加标签(“tag4”);
    transactionScope.Complete();
    }
    
    我们到底想比较什么?商业模式声明?现实生活中寻找的业务方法或手动分配的属性并调用Persist()方法?因此它将使用比纯(非ORM)过程编程多得多的查询?请参阅本文,了解我所说的非ORM解决方案,它只需要两个查询,无论有多少个标记: