【问题标题】:ICollection<Photo> generate different tables for different classes?ICollection<Photo> 为不同的类生成不同的表?
【发布时间】:2012-01-29 23:43:55
【问题描述】:

代码

public class Subsidiary
{
    public string Name { get; set; }
    public virtual ICollection<Photo> Photos { get; set; }
}

public class Party
{
    public string Name { get; set; }
    public virtual ICollection<Photo> Photos { get; set; }
}

public class Photo
{
    public string FileName { get; set; }
}

要生成数据库架构,请使用 Fluent API。

public class PartyConfiguration : EntityTypeConfiguration<Party>
{
    public PartyConfiguration()
    {
        HasMany(p => p.Photos).WithRequired().WillCascadeOnDelete();

    }
}

public class SubsidiaryConfiguration : EntityTypeConfiguration<Subsidiary>
{
    public SubsidiaryConfiguration()
    {
        HasMany(p => p.Photos).WithRequired().WillCascadeOnDelete();
    }
}

错误

所以我运行我的应用程序,出现以下错误

无法检查模型兼容性,因为数据库没有 包含模型元数据。确保 IncludeMetadataConvention 已 添加到 DbModelBuilder 约定中。

问题

我需要为每个类(SubsidiaryParty生成一个新表。 在这种情况下,将创建一个表 PartyPhotosSubsidiaryPhotos

如何使用 EF FluentAPI 进行此设置?

谢谢大家的帮助

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework-4.1 fluent


    【解决方案1】:

    尝试手动配置多对多配置。

    public class PartyConfiguration : EntityTypeConfiguration<Party>
    {
        public PartyConfiguration()
        {
            HasMany(p => p.Photos).WithMany()
            .Map(m => 
              {
                 m.ToTable("PartyPhotos");
                 m.MapLeftKey("PartyId");
                 m.MapRightKey("PhotoId");
              });
    
        }
    }
    
    public class SubsidiaryConfiguration : EntityTypeConfiguration<Subsidiary>
    {
        public SubsidiaryConfiguration()
        {
            HasMany(p => p.Photos).WithMany()
            .Map(m => 
              {
                 m.ToTable("SubsidiaryPhotos");
                 m.MapLeftKey("SubsidiaryId");
                 m.MapRightKey("PhotoId");
              });
        }
    }
    

    【讨论】:

    • 错误 The navigation property 'Photos' is not a declared property on type 'Party'. Verify that it has not been explicitly excluded from the model and that it is a valid navigation property.关系应该是:一对多 子公司有多张照片 一方有多张照片
    • EF 在此架构中创建表:Photos 表、SubsidiaryPhotos 表(与 Photos 的关系)、PartyPhotos 表(与 Photos 的关系)我会的照片就像这个方案中不存在该表在这种情况下SubsidiaryPhotosPhotosPhotos具有表的整个结构Photos两个表重复
    【解决方案2】:

    确保先删除数据库,然后重新运行项目。

    更新:如何将它添加到派生自 DbContext 的类中

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    {
        modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
    }
    

    【讨论】:

    • 问题是无法访问数据库。我已经删除了数据库,出现同样的错误!!
    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多