EF Построить свои отношения - PullRequest
2 голосов
/ 18 марта 2012

на этот раз у меня есть простой вопрос:

У меня есть одна таблица, связанная с ним

=====================
| Id                |  
| IdParent          |
| NodeName          | 
=====================

Где IdParent Может иметь 0 или много Id .Вопрос в том, как я могу настроить это отношение, используя FluentApi или аннотации данных.

Результатом этого отношения является дерево (с двумя уровнями), подобное этому:

a
|---b
|---c 
d
e
f---g    

где (a, d, e, f) - родительские узлы, а (b, c, g) - дочерние узлы.

Very Tks за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 18 марта 2012

Entity Framework поддерживает внешние ссылки с самостоятельными ссылками.Непонятно, являетесь ли вы базой данных первыми или первыми.

Если вы являетесь первым пользователем базы данных, просто создайте в своей базе данных внешний ключ с собственной ссылкой и обновите модель из БД.EF поддерживает этот стиль ключа начиная с EF 4.

С точки зрения кода, это может быть немного сложнее.Если вы используете EF 4.x, вам нужно переопределить функцию OnModelCreating (см. Пример здесь ).Если вы используете EF 5 (из .net 4.5 beta или CTP-версии в июне 2011 года), тогда этот вопрос дает хорошее руководство.Суть в том, чтобы использовать атрибут [ForeignKey("IdParent")] в вашей модели.

В любом случае вы должны увидеть что-то вроде XML ...

  <edmx:Runtime>
    <edmx:StorageModels>
    <Schema Namespace="...">
          <AssociationSet Name="FK_Culture_has_ParentCulture" 
                   Association="AL_Model.Store.FK_Culture_has_ParentCulture">
            <End Role="Culture" EntitySet="Culture" />
            <End Role="Culture1" EntitySet="Culture" />
          </AssociationSet>

 .....
 .....
 <edmx:ConceptualModels>
    <Schema Namespace="...">
    <EntityContainer Name="..." >
      <Association Name="FK_Culture_has_ParentCulture">
        <End Role="Culture" Type="AL_Model.Store.Culture" Multiplicity="0..1" />
        <End Role="Culture1" Type="AL_Model.Store.Culture" Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="Culture">
              <PropertyRef Name="CultureID" />
            </Principal>
            <Dependent Role="Culture1">
              <PropertyRef Name="ParentCultureID" />
            </Dependent>
          </ReferentialConstraint>
      </Association>

Само-ссылающаяся структура

Это утверждение требует небольшого внимания:

Where IdParent Could Have 0 or many Id. 

Чтобы иметь «ноль или идентификатор родителя», вам понадобится запись в вашей таблице, содержащая нольв качестве удостоверения личности.Зачем?потому что внешние ключи должны ссылаться на что-то .Однако я подозреваю, что вы хотите, чтобы сделал IdParent обнуляемым .В вашем вопросе не указана база данных, но в большинстве основных баз данных внешние ключи применяются только при наличии значения.Иными словами, в IdParent значение Null означает, что родительского элемента нет.

1 голос
/ 27 марта 2012

После многих попыток ... лучшее решение было извлечено из первой ссылки, приведенной здесь для примера EBarr).

Последнее решение для меня было:

Добавить Icollection в мою таблицу:

public partial class myTable
{
    public myTable()
    {
        this.Ids= new HashSet< myTable >();
    }
    public decimal id {get;set;}
    public decimal idParent {get;set;}
    public string  NodeName {get;set;}

    public Icollection<myTable> Ids {get;set;}
}

Затем с помощью Fluent Api

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<myTable>()
        .HasMany(x => x.Ids)
        .WithOptional()
        .HasForeignKey(m => m.IdParent);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...