#c# #.net #asp.net #asp.net-mvc #entity-framework
#c# #.net #asp.net #asp.net-mvc #entity-framework
Вопрос:
Я получил иерархическую таблицу со следующей структурой
Как вы можете видеть, 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 amp;amp; 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).
Ответ №1:
Это не шаблон именования для генерации POCO. Эти имена есть в вашей модели сущности. Измените имена в entity model (EDMX file — designer), и они также будут изменены в сгенерированном коде.
Комментарии:
1. Потрясающе. Я так не думал. Ты действительно спишь, Ладислав? Обычно я получаю мгновенные ответы (даже по существу) на любые ваши вопросы по EF. Спасибо за ваш ответ
Ответ №2:
Я не думаю, что шаблон EF t4 POCO был разработан для обработки этого сценария. Не рекомендуется редактировать файл вручную, поскольку вы потеряете свои изменения при следующем создании POCOs.
Таким образом, вам остается изменить шаблон. Но это не так уж плохо, потому что вы можете изменить шаблон так, чтобы он имел другой результат, только если таблица и поле соответствуют тем, которые вы указали выше.
Например, в моем шаблоне t4 я добавил это:
bool isRequired = !edmProperty.Nullable;
if (isRequired amp;amp; entity.Name == "Adjustment" amp;amp; propertyName == "AdjustmentNumber")
{
isRequired = false;
}
if (!isRequired amp;amp; entity.Name == "Order" amp;amp; propertyName == "RequiredDate")
{
isRequired = true;
}
<# if (isRequired) { #> [Required]
<# } #>
Эта модификация позволяет мне добавлять флаг [Required] к каждому полю, имеющему столбец NOT NULL в базе данных, за исключением двух упомянутых полей (не установлено значение required, поскольку пользовательский интерфейс не позволяет вводить эти поля).
Довольно легко установить конкретные правила для определенных полей, которые каким-то образом отличаются от нормы.
Комментарии:
1. Я проголосую за ваш ответ, но в данном конкретном случае ответ, предоставленный Ладиславом, является идеальным. В любом случае, хорошее объяснение того, как редактировать файл шаблона.