Шаблон POCO Entity Framework для иерархической таблицы - PullRequest
1 голос
/ 14 мая 2011

Я получил иерархическую таблицу со следующей структурой enter image description here

Как видите, ParentGroupUserID ссылается на ту же таблицу. Теперь, когда я использую шаблон EF POCO t4 для генерации класса для него, он имеет следующую структуру.

    public partial class GroupUser
{
    #region Primitive Properties

    public virtual int GroupUserID
    {
        get;
        set;
    }

    public virtual int GroupID
    {
        get;
        set;
    }

    public virtual string UserName
    {
        get;
        set;
    }

    #endregion
    #region Navigation Properties

    public virtual ICollection<GroupUser> GroupUser1
    {
        get
        {
            if (_groupUser1 == null)
            {
                var newCollection = new FixupCollection<GroupUser>();
                newCollection.CollectionChanged += FixupGroupUser1;
                _groupUser1 = newCollection;
            }
            return _groupUser1;
        }
        set
        {
            if (!ReferenceEquals(_groupUser1, value))
            {
                var previousValue = _groupUser1 as FixupCollection<GroupUser>;
                if (previousValue != null)
                {
                    previousValue.CollectionChanged -= FixupGroupUser1;
                }
                _groupUser1 = value;
                var newValue = value as FixupCollection<GroupUser>;
                if (newValue != null)
                {
                    newValue.CollectionChanged += FixupGroupUser1;
                }
            }
        }
    }
    private ICollection<GroupUser> _groupUser1;

    public virtual GroupUser GroupUser2
    {
        get { return _groupUser2; }
        set
        {
            if (!ReferenceEquals(_groupUser2, value))
            {
                var previousValue = _groupUser2;
                _groupUser2 = value;
                FixupGroupUser2(previousValue);
            }
        }
    }
    private GroupUser _groupUser2;

    public virtual ICollection<Franchise> Franchises
    {
        get
        {
            if (_franchises == null)
            {
                var newCollection = new FixupCollection<Franchise>();
                newCollection.CollectionChanged += FixupFranchises;
                _franchises = newCollection;
            }
            return _franchises;
        }
        set
        {
            if (!ReferenceEquals(_franchises, value))
            {
                var previousValue = _franchises as FixupCollection<Franchise>;
                if (previousValue != null)
                {
                    previousValue.CollectionChanged -= FixupFranchises;
                }
                _franchises = value;
                var newValue = value as FixupCollection<Franchise>;
                if (newValue != null)
                {
                    newValue.CollectionChanged += FixupFranchises;
                }
            }
        }
    }
    private ICollection<Franchise> _franchises;

    #endregion
    #region Association Fixup

    private void FixupGroupUser2(GroupUser previousValue)
    {
        if (previousValue != null && previousValue.GroupUser1.Contains(this))
        {
            previousValue.GroupUser1.Remove(this);
        }

        if (GroupUser2 != null)
        {
            if (!GroupUser2.GroupUser1.Contains(this))
            {
                GroupUser2.GroupUser1.Add(this);
            }
        }
    }

    private void FixupGroupUser1(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (GroupUser item in e.NewItems)
            {
                item.GroupUser2 = this;
            }
        }

        if (e.OldItems != null)
        {
            foreach (GroupUser item in e.OldItems)
            {
                if (ReferenceEquals(item.GroupUser2, this))
                {
                    item.GroupUser2 = null;
                }
            }
        }
    }

    private void FixupFranchises(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Franchise item in e.NewItems)
            {
                if (!item.GroupUsers.Contains(this))
                {
                    item.GroupUsers.Add(this);
                }
            }
        }

        if (e.OldItems != null)
        {
            foreach (Franchise item in e.OldItems)
            {
                if (item.GroupUsers.Contains(this))
                {
                    item.GroupUsers.Remove(this);
                }
            }
        }
    }

    #endregion
}

Если вы видите в приведенном выше коде, мне не нравится понятие именования моих открытых свойств GroupUser1 (который является коллекцией) и GroupUser2 (один объект). Может кто-нибудь помочь мне понять этот шаблон именования с генерацией POCO и есть ли способ, которым я могу переименовать его (без изменения шаблона t4).

Ответы [ 2 ]

1 голос
/ 14 мая 2011

Это не шаблон именования генерации POCO. Эти имена в вашей модели сущности. Измените имена в модели объекта (файл-дизайнер EDMX), и они будут изменены в сгенерированном коде.

1 голос
/ 14 мая 2011

Я не думаю, что шаблон EF t4 POCO был разработан для такого сценария.Не рекомендуется редактировать файл вручную, так как вы потеряете свои изменения при следующем создании POCO.

Так что вам остается изменить шаблон.Но это не так уж и плохо, потому что вы можете изменить шаблон так, чтобы он имел другой выход, только если таблица и поле соответствуют тем, которые вы указали выше.

Например, в свой шаблон t4 я добавил это:

bool isRequired = !edmProperty.Nullable;
if (isRequired && entity.Name == "Adjustment" && propertyName == "AdjustmentNumber") 
{
    isRequired = false;
}

if (!isRequired && entity.Name == "Order" && propertyName == "RequiredDate") 
{
    isRequired = true;
}

<# if (isRequired) { #>    [Required]
<# } #>

Эта модификация позволяет мне добавлять флаг [Обязательный] для каждого поля, в столбце которого есть NOT NULL в базе данных,за исключением двух упомянутых полей (не установлено обязательным, поскольку пользовательский интерфейс не позволяет вводить эти поля).

Довольно просто иметь определенные правила для определенных полей, которые в некоторой степени отличаются от нормы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...