EF CF отношение м-н через аннотации данных - PullRequest
0 голосов
/ 09 декабря 2011

Я хочу сопоставить отношения многие к маю, используя ТОЛЬКО аннотации данных, так что это мой случай.

Скажем, у меня есть следующая таблица

Foo:
FooId int identity
FooName varchar(max) not null

Bar:
BarId int identity
BarName varchar(max) not null

FooBarRelationships
TheBarId int 
TheFooId int 

Как вы видите таблицу соединенийсодержит имена FK, отличные от источника.Кроме того, имя таблицы также отличается

Мои классы следующие:

[Table("Foo")]
public class Foo {
    [Key]
    public Int32 FooId { get; set; }
    public String FooName { get; set; }

    public IEnumerable<Bar> Bars { get; set; }
}

[Table("Bar")]
public class Bar { 
    [Key]
    public Int32 BarId { get; set; }
    public String BarName { get; set; }

    public IEnumerable<Foo> Foos { get; set; }
}

Как мне изменить мои классы, используя аннотации данных, чтобы сказать, что таблица FooBarRelationshipsтаблица соединений и TheBarId - это внешний ключ из таблицы Bar, а TheFooId - это внешний ключ из таблицы Foo?

PS

Имеянавигационные свойства, объявленные как IEnumerable<T>, а не ICollection<T>, являются существенными.

Я пытался отобразить его, используя класс карты, который выглядит следующим образом

public class BarMap : EntityTypeConfiguration<Bar> {
    public BarMap() {
        this.HasMany(t => t.Foos)
            .WithMany(t => t.Bars)
            .Map(m => {
                m.ToTable("FooBarRelationships");
                m.MapLeftKey("TheBarId");
                m.MapRightKey("TheFooId");
            });
    }
}

, это дает мне следующую ошибку.

Аргументы типа дляМетод 'System.Data.Entity.ModelConfiguration.EntityTypeConfiguration .HasMany (System.Linq.Expressions.Expression>) 'не может быть выведено из использования.Попробуйте явно указать аргументы типа.

Если есть способ устранить эту ошибку без изменения типа IEnumeralbe<T> на ICollection<T>, это также приветствуется.

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Если вы не используете плавное отображение, вы должны использовать имя соединительной таблицы и ее столбцы, ожидаемые по умолчанию, что-то вроде: FooBars со столбцами Foo_FooId и Bar_BarId.

Также, как упомянуто в ответе @Inu, IEnumerable не поддерживается - по крайней мере, ленивая загрузка прокси требует ICollection, и я почти уверен, что это глобальное требование (как упомянуто в связанном ответе ). Сначала код обычно пропускает все свойства IEnumerable из сопоставления. Даже если он каким-то образом поддерживается, IEnumerable является просто интерфейсом, а позади него будет какой-то класс, такой как Collection, HashSet или List, поэтому предоставление enumerable не ограничит код, использующий вашу сущность для преобразования вашего свойства навигации в это коллекционный класс.

1 голос
/ 09 декабря 2011

Я не думаю, что вы могли бы использовать IEnumerable, потому что для сущностной инфраструктуры нужен объект, который можно назначить.

Поддерживается ли коллекция IEnumerable в EF 4.1 для отображения?Вы должны атаковать проблему под другим углом.

последняя часть:

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

[Table("Foo")]
public class Foo {
    [Key]
    public Int32 FooId { get; set; }
    public String FooName { get; set; }
    [InverseAttribute("Foos")]
    public ICollection<Bar> Bars { get; set; }
}

[Table("Bar")]
public class Bar { 
    [Key]
    public Int32 BarId { get; set; }
    public String BarName { get; set; }
    [InverseAttribute("Bars")]
    public ICollection<Foo> Foos { get; set; }
}
...