Entity framework 4 使用EF CPT5进行领域建模和映射

Entity framework 4 使用EF CPT5进行领域建模和映射,entity-framework-4,ef-code-first,Entity Framework 4,Ef Code First,我正在尝试制作一个包含照片集的相册。每个相册都有一组照片和一张拇指照片。这是我所拥有的,但EF似乎不喜欢它。我正在使用EF CPT5 模型: public class Album : IEntity { private DateTime _dateCreated; public Album() { _dateCreated = SystemTime.Now(); Photos = new List<Photo>(); } public long Id

我正在尝试制作一个包含照片集的相册。每个相册都有一组照片和一张拇指照片。这是我所拥有的,但EF似乎不喜欢它。我正在使用EF CPT5

模型

public class Album : IEntity {
  private DateTime _dateCreated;
  public Album() {
    _dateCreated = SystemTime.Now();
    Photos = new List<Photo>();
  }

  public long Id { get; set; }
  public string Name { get; set; }
  public string Location { get; set; }
  public DateTime DateCreated {  get { return _dateCreated; }  set { _dateCreated = value; } }

  public virtual Site Site { get; set; }
  public virtual Photo Thumbnail { get; set; }
  public long ThumbnailId { get; set; }
  public virtual ICollection<Photo> Photos { get; set; }
 }



public class Photo : IEntity {
  public Photo() {
    _dateCreated = SystemTime.Now();
  }
  private DateTime _dateCreated;
  public long Id { get; set; }
  public string Caption { get; set; }
  public string FileName { get; set; }
  public DateTime DateCreated<br/>{ get { return _dateCreated; } set { _dateCreated = value; } }
  public long AlbymId { get; set; }
  public virtual Album Album { get; set; }
 }
公共类专辑:IEntity{
私有日期时间_dateCreated;
公共相册(){
_dateCreated=SystemTime.Now();
照片=新列表();
}
公共长Id{get;set;}
公共字符串名称{get;set;}
公共字符串位置{get;set;}
public DateTime DateCreated{get{return{u DateCreated;}set{{u DateCreated=value;}}
公共虚拟站点站点{get;set;}
公共虚拟照片缩略图{get;set;}
公共长缩略图ID{get;set;}
公共虚拟ICollection照片{get;set;}
}
公开课照片:美国{
公众照片(){
_dateCreated=SystemTime.Now();
}
私有日期时间_dateCreated;
公共长Id{get;set;}
公共字符串标题{get;set;}
公共字符串文件名{get;set;}
public DateTime DateCreated
{get{return\u DateCreated;}set{\u DateCreated=value;}} 公共长AlbymId{get;set;} 公共虚拟相册相册{get;set;} }
映射代码:

public class AlbumMap : EntityTypeConfiguration<Album> {
  public AlbumMap() {
    HasRequired(x => x.Thumbnail).WithMany().HasForeignKey(a => a.ThumbnailId).WillCascadeOnDelete(false);
        Property(x => x.Location).IsVariableLength().HasMaxLength(80);
        Property(x => x.Name).IsVariableLength().HasMaxLength(80).IsRequired();
    }
 }

 public class PhotoMap : EntityTypeConfiguration<Photo> {
  public PhotoMap() {
    HasRequired(p => p.Album).WithMany(a => a.Photos).HasForeignKey(p => p.AlbymId);
    Property(x => x.FileName).IsVariableLength().HasMaxLength(255).IsRequired();
    Property(x => x.Caption).IsVariableLength().HasMaxLength(255);
    Property(x => x.DateCreated);
    ToTable("SiteAlbumPhotos");
    }
 }
公共类AlbumMap:EntityTypeConfiguration{
公共地图(){
HasRequired(x=>x.Thumbnail).WithMany().HasForeignKey(a=>a.ThumbnailId).WillCascadeOnDelete(false);
属性(x=>x.Location).IsVariableLength().HasMaxLength(80);
属性(x=>x.Name).IsVariableLength().HasMaxLength(80.IsRequired();
}
}
公共类PhotoMap:EntityTypeConfiguration{
公共影像地图(){
HasRequired(p=>p.Album)。有许多(a=>a.Photos)。HasForeignKey(p=>p.AlbymId);
属性(x=>x.FileName).IsVariableLength().HasMaxLength(255.IsRequired();
属性(x=>x.Caption).IsVariableLength().HasMaxLength(255);
属性(x=>x.DateCreated);
ToTable(“网站相册照片”);
}
}
上下文

public class Database : ObjectContext {

        public Database(EntityConnection connection) : base(connection) {
            ContextOptions.LazyLoadingEnabled = true;
            ContextOptions.ProxyCreationEnabled = true;
        }

        private IObjectSet<User> _users;
        private IObjectSet<Site> _sites;
        private IObjectSet<SiteDonation> _donations;
        private IObjectSet<SiteAnnouncement> _siteAnnouncements;
        private IObjectSet<SiteData> _siteData;
        private IObjectSet<SiteLink> _siteLinks;
        private IObjectSet<SitePost> _sitePosts;
        private IObjectSet<Theme> _theme;
        private IObjectSet<Album> _siteAlbums;
        private IObjectSet<Photo> _siteAlbumPhotos;
        private IObjectSet<CommunityPost> _communityPosts;
        private IObjectSet<CommunityComment> _communityComments;

        public IObjectSet<User> Users {
            get{ return _users ?? (_users = ObjectSet<User>()); }
        }
        public IObjectSet<Album> SiteAlbums {
            get { return _siteAlbums ?? (_siteAlbums =  ObjectSet<Album>()); }
        }
        public IObjectSet<Photo> SiteAlbumsPhotos {
            get { return _siteAlbumPhotos ?? (_siteAlbumPhotos = ObjectSet<Photo>()); }
        }
        public IObjectSet<Site> Sites {
            get{ return _sites ?? (_sites = ObjectSet<Site>()); }
        }

        public IObjectSet<SiteDonation> SiteDonations {
            get { return _donations ?? (_donations = ObjectSet<SiteDonation>()); }
        }

        public IObjectSet<SiteAnnouncement> SiteAnnouncements {
            get { return _siteAnnouncements ?? (_siteAnnouncements = ObjectSet<SiteAnnouncement>()); }
        }

        public IObjectSet<SiteData> SiteData {
            get { return _siteData ?? (_siteData = ObjectSet<SiteData>()); }
        }

        public IObjectSet<SiteLink> SiteLinks {
            get { return _siteLinks ?? (_siteLinks = ObjectSet<SiteLink>()); }
        }

        public IObjectSet<SitePost> SitePosts {
            get { return _sitePosts ?? (_sitePosts = ObjectSet<SitePost>()); }
        }

        public IObjectSet<Theme> Themes { 
            get { return _theme ?? (_theme = ObjectSet<Theme>()); }
        }
        public IObjectSet<CommunityPost> CommunityPosts {
            get { return _communityPosts ?? (_communityPosts = ObjectSet<CommunityPost>()); }
        }
        public IObjectSet<CommunityComment> CommunityComments {
            get { return _communityComments ?? (_communityComments = ObjectSet<CommunityComment>()); }
        }

        public virtual IObjectSet<T> ObjectSet<T>() where T : class, IEntity {
            return CreateObjectSet<T>();
        }
        public virtual void Commit() {
            SaveChanges();
        }
    }
公共类数据库:ObjectContext{ 公共数据库(EntityConnection连接):基本(连接){ ContextOptions.LazyLoadingEnabled=true; ContextOptions.ProxyCreationEnabled=true; } 私有IObjectSet_用户; 私有IObjectSet_站点; 私人IObjectSet_捐赠; 私有IObjectSet\u站点公告; 私有IObjectSet\u站点数据; 私有IObjectSet_站点链接; 私有IObjectSet_sitePosts; 私有IObjectSet_主题; 私有IObjectSet\u站点相册; 私有IObjectSet_siteAlbumPhotos; 私有对象集(communityPosts);; 私有IObjectSet_communityComments; 公共IObjectSet用户{ 获取{return\u users???(\u users=ObjectSet());} } 公共IObjectSet站点相册{ 获取{return}sitealmbs???(\u sitealmbs=ObjectSet());} } 公共IObjectSet站点AlbumSphotos{ 获取{return}siteAlbumPhotos???(siteAlbumPhotos=ObjectSet());} } 公共IObjectSet站点{ 获取{return\u sites???(\u sites=ObjectSet());} } 公共IObjectSet站点{ 获取{return} } 公共IObjectSet站点公告{ 获取{return}siteAnnouncements???(_siteAnnouncements=ObjectSet());} } 公共IObjectSet站点数据{ 获取{return\u siteData???(\u siteData=ObjectSet());} } 公共IObjectSet站点链接{ 获取{return _siteLinks???(_siteLinks=ObjectSet());} } 公共IObjectSet站点帖子{ 获取{return}sitePosts???(_sitePosts=ObjectSet());} } 公共IObjectSet主题{ 获取{return\u theme???(\u theme=ObjectSet());} } 公共IObjectSet通讯器{ 获取{return\u communityPosts???(\u communityPosts=ObjectSet());} } 公共IObjectSet社区命令{ 获取{return\u communityComments???(\u communityComments=ObjectSet());} } 公共虚拟IObjectSet ObjectSet(),其中T:class,Entity{ 返回CreateObjectSet(); } 公共虚拟无效提交(){ 保存更改(); } } 数据库工厂

public class DatabaseFactory : Disposable, IDatabaseFactory
    {
        private static readonly ModelBuilder builder = CreateBuilder();
        private readonly DbProviderFactory _providerFactory;
        private readonly string _connectionString;
        private Database _database;
        //
        public DatabaseFactory(DbProviderFactory providerFactory, string connectionString)
        {
            Check.Argument.IsNotNull(providerFactory, "providerFactory");
            Check.Argument.IsNotNullOrEmpty(connectionString, "connectionString");
            _providerFactory = providerFactory;
            _connectionString = connectionString;
        }
        //
        public Database Get()
        {
            if(_database == null)
            {
                var connection = _providerFactory.CreateConnection();
                connection.ConnectionString = _connectionString;
                //_database = builder.CreateModel(connection); LEG 1 CPT 3
                //var ctx = dbModel.CreateObjectContext<ObjectContext>(_connectionString); LEG 1 CPT 3
                //var modelBuilder = builder.CreateModel(); LEG 2 CPT 4
                //_database = modelBuilder.CreateObjectContext<Database>(connection); LEG 2 CPT 4
                //_database = modelBuilder.CreateObjectContext<Database>(connection); LEG 2 CPT 4
                var modelBuilder = builder.Build(connection);
                var dbModel = new DbModel(modelBuilder);
                _database = dbModel.CreateObjectContext<Database>(connection);

            }

            return _database;
        }
        //
        protected override void DisposeCore()
        {
            if (_database != null)
            {
                _database.Dispose();
            }
        }
        //
        private static ModelBuilder CreateBuilder()
        {
            //ContextBuilder<Database> contextBuilder = new ContextBuilder<Database>();
            var contextBuilder = new ModelBuilder();
            //IEnumerable<Type> configurationTypes = typeof(DatabaseFactory)
            //    .Assembly
            //    .GetTypes()
            //    .Where(type => type.IsPublic && type.IsClass && !type.IsAbstract && !type.IsGenericType && typeof(StructuralTypeConfiguration).IsAssignableFrom(type) && (type.GetConstructor(Type.EmptyTypes) != null));

            //foreach (StructuralTypeConfiguration configuration in configurationTypes.Select(type => (StructuralTypeConfiguration)Activator.CreateInstance(type)))
            //{
            //    contextBuilder.Configurations.Add(configuration);
            //}
            contextBuilder.Configurations.Add(new CommunityCommentMap());
            contextBuilder.Configurations.Add(new CommunityPostMap());
            contextBuilder.Configurations.Add(new SiteAlbumMap());
            contextBuilder.Configurations.Add(new SiteAlbumPhotoMap());
            contextBuilder.Configurations.Add(new SiteAnnouncementMap());
            contextBuilder.Configurations.Add(new SiteDataMap());
            contextBuilder.Configurations.Add(new SiteDonationMap());
            contextBuilder.Configurations.Add(new SiteLinkMap());
            contextBuilder.Configurations.Add(new SiteMap());
            contextBuilder.Configurations.Add(new SitePostMap());
            contextBuilder.Configurations.Add(new ThemeMap());
            contextBuilder.Configurations.Add(new UserMap());
            return contextBuilder;
        }
    }
公共类数据库工厂:一次性,IDatabaseFactory
{
私有静态只读ModelBuilder=CreateBuilder();
私有只读DbProviderFactory\u providerFactory;
私有只读字符串_connectionString;
私有数据库;
//
公共数据库工厂(DbProviderFactory providerFactory,字符串连接字符串)
{
Check.Argument.IsNotNull(providerFactory,“providerFactory”);
Check.Argument.IsNotNullOrEmpty(connectionString,“connectionString”);
_providerFactory=providerFactory;
_connectionString=connectionString;
}
//
公共数据库Get()
{
如果(_database==null)
{
var connection=_providerFactory.CreateConnection();
connection.ConnectionString=\u ConnectionString;
//_数据库=builder.CreateModel(连接);第1段CPT 3
//var ctx=dbModel.CreateObjectContext(_connectionString);LEG 1 CPT 3
//var modelBuilder=builder.CreateModel();支腿2 CPT 4
//_数据库=modelBuilder.CreateObjectContext(连接);第2段CPT 4
//_数据库=modelBuilder.CreateObjectContext(连接);第2段CPT 4
var modelBuilder=builder.Build(连接);
var dbModel=新的dbModel(modelBuilder);
_database=dbModel.CreateObjectContext(连接);
public class Photo 
{
    public long PhotoId { get; set; }        
    [MaxLength(255)]
    public string Caption { get; set; }        
    [MaxLength(255)][Required]
    public string FileName { get; set; }        
    public DateTime DateCreated { get; set; }
    public long AlbumId { get; set; }        
    public virtual Album Album { get; set; }
}

[Table("SiteAlbumPhotos")]
public class Album 
{
    public long AlbumId { get; set; }        
    [MaxLength(80)][Required]
    public string Name { get; set; }        
    [MaxLength(80)]
    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 : EntityTypeConfiguration<Photo> {
    public PhotoMap() {            
        HasRequired(p => p.Album).WithMany(a => a.Photos)
                                 .HasForeignKey(p => p.AlbumId);
    }
}

public class AlbumMap : EntityTypeConfiguration<Album> {
    public AlbumMap() {
        HasRequired(a => a.Thumbnail).WithMany()
                                     .HasForeignKey(a => a.ThumbnailId)
                                     .WillCascadeOnDelete(false);
    }
}

public class MyContext : DbContext {
    public DbSet<Photo> Photos { get; set; }
    public DbSet<Album> Albums { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder) {
        modelBuilder.Configurations.Add<Photo>(new PhotoMap());
        modelBuilder.Configurations.Add<Album>(new AlbumMap());
    }
}