как проверить сущности / отношения в целом - PullRequest
0 голосов
/ 31 мая 2019

У меня есть сущности / отношения, подобные следующим: A -> B;B -> C, B -> D, B -> E, ...

Когда пользователь хочет удалить объект A, я проверяю, есть ли у каких-либо его дочерних объектов B какие-либо записи для объектов C, иD-сущности и т. Д. И предоставляют подробное сообщение об ошибке.

Однако требуется, чтобы в конечном итоге мы добавили больше типов сущностей, таких как B -> FutureEntity.Есть ли способ либо вообще проверить все это, либо, по крайней мере, убедиться, что в будущем, если такой объект будет добавлен, я изменю функцию удаления для учета таких объектов?

1 Ответ

0 голосов
/ 01 июня 2019

Этого можно добиться, добавив следующие функции к BaseEntity:

public abstract class BaseEntity
{

    [Key]
    public int Id { get; set; }

    public abstract bool IsChildOfBee();
    public abstract string GetDisplayName();
}

При добавлении дочерней сущности переопределяйте эти методы:

public class EntityCee :BaseEntity
{
    public string Name { get; set; }


    public override string GetDisplayName()
    {
        return "Entity Cee";
    }

    public override bool IsChildOfBee()
    {
        return true;
    }
}

Перед удалением сущностиB, проверьте связанные сущности:

var errors = new List<string>();

var entityBeeToDelete = _exampleRepository.GetEntityBee(1);

var associatedEntities = _exampleRepository.GetAssociatedEntities(entityBeeToDelete);

foreach(var e in associatedEntities)
{
    errors.Add($"{entityBeeToDelete.GetDisplayName()} has some {e} records associated with it. Please delete those before deleting {entityBeeToDelete.GetDisplayName()}");
}

Вот функция, которая проверяет связанные дочерние элементы:

public List<string> GetAssociatedEntities(EntityBee bee)
{
    var types = new List<string>();

    foreach (var entityType in this.Model.GetEntityTypes())
    {
        var clr = entityType.ClrType;

        var tableName = entityType.Relational().TableName;

        BaseEntity instance = (BaseEntity)Activator.CreateInstance(clr);

        var isChildOfBee = instance.IsChildOfBee();

        if(isChildOfBee)
        {
            var query = $"select top(1) * from EntityBees where Id IN (select EntityBeeId from {tableName} where EntityBeeId = {bee.Id})";

            var eB = this.EntityBees.FromSql(query).FirstOrDefault();

            if(eB != null)
            {
                types.Add(instance.GetDisplayName());
            }

        }

    }
    return types;
}
...