По общему правилу, код EF сначала не создает таблицу ссылок в типичном сценарии «один ко многим», причина, по которой вы его получаете, заключается в том, что ваши ассоциации между объектами Album и Photo были приняты EF какявляясь своего рода ассоциацией многих ко многим:
Каждый альбом имеет коллекцию фотографий, а также каждая фотография имеет коллекцию альбомов, для которых эта фотография является миниатюрой (хотя соответствующее свойство навигации не указано явно в классе Photo и толькоАльбом имеет свойство Thumbnail).
Решение:
Начиная с EF CTP4, единственный способ исправить это - использовать Fluent API, но перед этим я немного изменю вашу модель идобавьте два явных FK в вашу модель, чтобы обеспечить максимальную гибкость при работе с вашими объектами.Они AlbumId
на Photo
и ThumbnailId
на Album
:
public class Photo {
public long Id { get; set; }
public string Caption { get; set; }
public string FileName { get; set; }
public DateTime DateCreated { get; set; }
public long AlbumId { get; set; }
public virtual Album Album { get; set; }
}
public class Album {
public long Id { get; set; }
public string Name { get; set; }
public string Location { get; set; }
public DateTime DateCreated { get; set; }
public long ThumbnailId { get; set; }
public virtual Photo Thumbnail { get; set; }
public virtual ICollection<Photo> Photos { get; set; }
}
public class PhotoMap : EntityConfiguration<Photo> {
public PhotoMap()
{
this.HasRequired(p => p.Album)
.WithMany(a => a.Photos)
.HasConstraint((p, a) => p.AlbumId == a.Id);
Property(x => x.FileName).IsVariableLength().HasMaxLength(255)
.IsRequired();
Property(x => x.Caption).IsVariableLength().HasMaxLength(255);
MapSingleType(p => new {
p.Id,
SiteAlbumId = p.AlbumId,
p.FileName,
p.Caption,
p.DateCreated
})
.ToTable("Photo");
}
}
public class AlbumMap : EntityConfiguration<Album> {
public AlbumMap()
{
this.HasRequired(a => a.Thumbnail)
.WithMany()
.WillCascadeOnDelete(false)
.HasConstraint((a, p) => p.Id == a.ThumbnailId);
Property(x => x.Location).IsVariableLength().HasMaxLength(80);
Property(x => x.Name).IsVariableLength().HasMaxLength(80).IsRequired();
MapSingleType(a => new {
a.Id,
a.ThumbnailId,
a.Location,
a.Name,
a.DateCreated
})
.ToTable("Album");
}
}
Это приводит к следующей желаемой схеме: