【问题标题】:Entity Framework POCO template for Hierarchical table层次表的实体框架 POCO 模板
【发布时间】:2011-05-14 09:44:48
【问题描述】:

我得到了一个具有以下结构的层次表

如您所见,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 模板)。

【问题讨论】:

    标签: c# .net asp.net asp.net-mvc entity-framework


    【解决方案1】:

    这不是 POCO 生成的命名模式。这些名称在您的实体模型中。更改实体模型中的名称(EDMX 文件 - 设计器),它们也将在生成的代码中更改。

    【讨论】:

    • 太棒了。我不这么认为。你真的睡拉迪斯拉夫吗?对于您提出的任何 EF 问题,我通常会立即得到答案(甚至是直截了当)。感谢您的回答
    【解决方案2】:

    我不认为 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]
    <# } #>
    

    此修改允许我将 [Required] 标志添加到数据库中每个具有 NOT NULL 列的字段,除了提到的两个字段(未设置为必需,因为 UI 不允许您输入这些字段) .

    很容易为某些领域制定与规范不同的特定规则。

    【讨论】:

    • 我会对你的答案投赞成票,但在这种特殊情况下,Ladislav 提供的答案是完美的。无论如何,很好地解释了如何编辑模板文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2012-05-23
    • 2011-08-21
    • 2011-07-08
    • 2011-03-19
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多