Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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
C# Sitecore内容树显示“;“图像”;使用自定义数据提供程序插入后的项_C#_.net_Sitecore_Dataprovider_Northwind - Fatal编程技术网

C# Sitecore内容树显示“;“图像”;使用自定义数据提供程序插入后的项

C# Sitecore内容树显示“;“图像”;使用自定义数据提供程序插入后的项,c#,.net,sitecore,dataprovider,northwind,C#,.net,Sitecore,Dataprovider,Northwind,按照以下步骤实现自定义读写提供程序。 问题是在内容树中插入一个新项目时,它会显示该项目的两个副本,另一个基本上是“图像”,即相同的ID,无法编辑,甚至不能单击该“图像”项目。但对真实项目的任何更改都将显示在“图像”项目上(编辑、删除)。我还检查了外部数据库(SQL Server)表,只创建了一条记录。所以,问题在于Sitecore如何在内容树下两次显示该项目 对不起,我没有足够的声誉来发布screeshot 方法代码: public override ItemDefinition GetIt

按照以下步骤实现自定义读写提供程序。 问题是在内容树中插入一个新项目时,它会显示该项目的两个副本,另一个基本上是“图像”,即相同的ID,无法编辑,甚至不能单击该“图像”项目。但对真实项目的任何更改都将显示在“图像”项目上(编辑、删除)。我还检查了外部数据库(SQL Server)表,只创建了一条记录。所以,问题在于Sitecore如何在内容树下两次显示该项目

对不起,我没有足够的声誉来发布screeshot

方法代码:

  public override ItemDefinition GetItemDefinition(ID id, CallContext context)
  {
     ItemDefinition newItem = null;
     if (CanProcessChild(id, context))
     {
        object orifinalID = GetOriginalRecordID(id);

        StringBuilder sqlSelect = new StringBuilder();
        sqlSelect.AppendFormat("SELECT {0} FROM {1}", nameField, table);
        sqlSelect.Append(GetConditions(orifinalID));

        string[] result = SqlUtil.GetStringArray(sqlSelect.ToString(), connectionString);
        if (result.Length > 0)
        {
           string itemName = result[0];
           if (string.IsNullOrEmpty(itemName))
           {
              itemName = "unnamed item";
           }

           newItem = new ItemDefinition(id, itemName, MainDB.Templates[new ID(templateID)].ID, ID.Null);
           ((ICacheable)newItem).Cacheable = false;
        }
     }
     return newItem;
  }


  public override FieldList GetItemFields(ItemDefinition item, VersionUri version, CallContext context)
  {
     if (CanProcessChild(item.ID, context))
     {
        if (context.DataManager.DataSource.ItemExists(item.ID))
        {
           ReflectionUtil.CallMethod(
              typeof(ItemCache), CacheManager.GetItemCache(context.DataManager.Database),
              "RemoveItem", true, true, new object[] { item.ID });
        }

        CoreItem.Builder builder = CreateItemBuilder(item, context.DataManager);
        return builder.ItemData.Fields;
     }
     return null;

  public override bool CreateItem(ID itemID, string itemName, ID tempID, ItemDefinition parent, CallContext context)
  {
      if (new ID(templateID) == tempID && new ID(parentItemID) == parent.ID)
      {
          string fields = GetFieldsName();
          StringCollection valuesBuilder = new StringCollection();
          foreach (string field in fieldNames)
          {
              if (field == nameField)
              {
                  valuesBuilder.Add(String.Format("'{0}'", itemName));
                  continue;
              };
              if (field == idField)
              {
                  valuesBuilder.Add(String.Format("'{0}'", ID.Encode(itemID).Substring(0, 4)));
                  continue;
              };
              valuesBuilder.Add("''");
          }
          string values = StringUtil.StringCollectionToString(valuesBuilder, " ,");
          Insert(fields, values);
          IDTable.Add(ToString(), ID.Encode(itemID).Substring(0, 4), itemID, parent.ID);              
          context.Abort();
          return true;
      }
      return false;
  }

  CoreItem.Builder CreateItemBuilder(ItemDefinition item, DataManager dataManager)
  {
     CoreItem.Builder result = new CoreItem.Builder(item.ID, item.Name, item.TemplateID, dataManager);
     StringBuilder sqlSelect = new StringBuilder();
     sqlSelect.AppendFormat("SELECT {0} FROM {1}", fieldsNames, table);
     sqlSelect.Append(GetConditions(GetOriginalRecordID(item.ID)));
     using (SqlDataReader sqlResult = ExecuteReader(sqlSelect.ToString(), connectionString))
     {
        if (sqlResult.Read())
        {
           for (int i = 0; i < sqlResult.FieldCount; i++)
           {
              result.AddField(sqlResult.GetName(i), ToSitecoreValue(sqlResult.GetValue(i)));
           }
        }
     }
     return result;
  }
public覆盖项定义GetItemDefinition(ID,CallContext上下文)
{
ItemDefinition newItem=null;
if(CanProcessChild(id,context))
{
object orifinalID=GetOriginalRecordID(id);
StringBuilder sqlSelect=新建StringBuilder();
AppendFormat(“从{1}中选择{0}”,名称字段,表格);
Append(GetConditions(orifinalID));
string[]result=SqlUtil.GetStringArray(sqlSelect.ToString(),connectionString);
如果(result.Length>0)
{
字符串itemName=result[0];
if(string.IsNullOrEmpty(itemName))
{
itemName=“未命名项”;
}
newItem=new ItemDefinition(id,itemName,MainDB.Templates[new id(templateID)].id,id.Null);
((ICacheable)newItem).Cacheable=false;
}
}
返回新项目;
}
公共覆盖字段列表GetItemFields(ItemDefinition项、VersionUri版本、CallContext上下文)
{
if(CanProcessChild(item.ID,context))
{
if(context.DataManager.DataSource.ItemExists(item.ID))
{
ReflectionUtil.CallMethod(
typeof(ItemCache),CacheManager.GetItemCache(context.DataManager.Database),
“RemoveItem”,true,true,新对象[]{item.ID});
}
CoreItem.Builder=CreateItemBuilder(item,context.DataManager);
返回builder.ItemData.Fields;
}
返回null;
public override bool CreateItem(ID itemID、string itemName、ID tempID、ItemDefinition父项、CallContext上下文)
{
if(新ID(templateID)==tempID&&newid(parentItemID)==parent.ID)
{
字符串字段=GetFieldsName();
StringCollection valuesBuilder=新StringCollection();
foreach(字段名中的字符串字段)
{
如果(字段==名称字段)
{
Add(String.Format(“{0}”,itemName));
继续;
};
如果(字段==idField)
{
Add(String.Format(“{0}”,ID.Encode(itemID).Substring(0,4));
继续;
};
valuesBuilder。添加(“”);
}
字符串值=StringUtil.StringCollectionToString(valuesBuilder,“,”);
插入(字段、值);
Add(ToString(),ID.Encode(itemID).Substring(0,4),itemID,parent.ID);
context.Abort();
返回true;
}
返回false;
}
生成器CreateItemBuilder(ItemDefinition项,DataManager DataManager)
{
CoreItem.Builder结果=新的CoreItem.Builder(item.ID、item.Name、item.TemplateID、dataManager);
StringBuilder sqlSelect=新建StringBuilder();
AppendFormat(“从{1}中选择{0}”,字段名称,表格);
Append(GetConditions(GetOriginalRecordID(item.ID));
使用(SqlDataReader sqlResult=ExecuteReader(sqlSelect.ToString(),connectionString))
{
if(sqlResult.Read())
{
对于(int i=0;i
基本上CreateItem方法是直接插入到SQL表中,Sitecore将拾取新插入的项。我发现如果通过Sitecore插入,则在后代表中会创建一行;但是如果从外部数据库表创建,则不会创建这样的行,并且数据将在没有“图像”的情况下正确显示

我是sitecore的新手,不知道这个问题的原因是什么


非常感谢您的帮助!

看起来您的内容树同时使用了多个提供商

如果要确保在数据提供程序运行后不会运行后续数据提供程序,请调用传递给数据提供程序的
CallContext
对象上的
Abort()
方法

有关Sitecore社区文档中数据提供程序的更多信息


非常感谢您的回复。我确实检查了每个方法,最后都有context.abort();我甚至每次都尝试清除缓存。这些都不起作用:(