Мне предоставили базу данных, с которой должны быть возможны основные операции CRUD. Это было быстро достигнуто с помощью .NET 4.5 / MVC5 и EF6. Это означает подход «сначала база данных».
Новое требование: (эластичный) поиск.
При создании индекса для пользовательского класса (не связанного с другими в модели) все в порядке. Когда я использую класс с большим количеством внешних ключей, все перестает работать. База данных состоит из 100 таблиц с более чем 400 внешними ключами.
Я думаю, что проблема может заключаться в циклических ссылках (у клиента n контрактов, в которых есть ссылка на клиента, у которого есть список контрактов ... Вы понимаете). В конце концов я получаю исключение OutOfMemory, и все рушится.
Код:
public static Uri node;
public static ConnectionSettings settings;
public static ElasticClient client;
public ActionResult TestIndex()
{
node = new Uri("http://localhost:9200");
settings = new ConnectionSettings(node, defaultIndex: "crudapp");
client = new ElasticClient(settings);
var indexSettings = new IndexSettings();
indexSettings.NumberOfReplicas = 1;
indexSettings.NumberOfShards = 1;
//The next line causes the OutOfMemoryException
client.CreateIndex(c => c.Index("crudapp")
.InitializeUsing(indexSettings)
.AddMapping<Customer>(map => map.MapFromAttributes(maxRecursion: 1)));
foreach (Customer c in db.Customer.Where(a => a.Active == true))
client.Index(c);
return View("Index");
}
Как я могу сказать Nest, чтобы он прекратил рекурсию или не использовал определенные объекты?
Примеры занятий:
public partial class Customer
{
public Customer()
{
this.CustomerContract = new HashSet<CustomerContract>();
}
public int Customerid { get; set; }
public string CustomerName { get; set; }
public string Description { get; set; }
public bool Active { get; set; }
public virtual ICollection<CustomerContract> CustomerContract { get; set; }
}
public partial class CustomerContract
{
public CustomerContract()
{
this.Host = new HashSet<Host>();
}
public int CustomerContractid { get; set; }
public string CustomerContractName { get; set; }
public string Description { get; set; }
public int CustomerID { get; set; }
public bool Active { get; set; }
public virtual Customer Customer { get; set; }
public virtual ICollection<Host> Host { get; set; }
}