EntityFramework 1到0,1或多个关系

时间:2017-04-25 18:16:19

标签: c# wpf sqlite entity-framework-6

我正在努力在三个表之间的Entity框架中创建一个关系.. 我正在使用C#,Sqlite 3.0和Entity Framework 6开发WPF应用程序。

我有以下表格(类):

  1. 投资者
  2. 投资
  3. ImageStore
  4. 我想创建一个模型,以便投资者和投资(以及未来的其他类)可以存储0,1或许多图像..(从类名中可以明显看出,投资者只能拥有一个个人资料图像和投资类别可以有多个图像) 我的ImageStore类看起来像这样:

    public class ImageStore : PropertyChangedNotification
        {
            [Key]
            public int ImageStoreId { get; set; }
            [Required]
            public string ImageFile { get; set; }
            [Required]
            public Byte[] ImageBlob { get; set; }
    
            public string FileName { get; set; }
            [Required]
            public int FileSize { get; set; }
    
    
            //public virtual ImageData ImageData { get; set; }
        }
    

    为了创建1到0,1或许多关系,我创建了一个名为ImageData的中间表,如下所示(我不知道它是否真的是一个好方法,但这只是我能做到的想想现在..)

    public class ImageData : PropertyChangedNotification
        {
            [Key]
            public int ImageDataId { get; set; }
    
            [ForeignKey("Investment")]
            public long? InvestmentId { get; set; }
    
            [ForeignKey("Investor")]
            public long? InvestorId { get; set; }
    
            [ForeignKey("ImageStore")]
            public int ImageStoreId { get; set; }
    
            public virtual ImageStore ImageStore { get; set; }
    
            public virtual Investment Investment { get; set; }
    
           public virtual Investor Investor { get; set; }
        }
    

    我的投资者课程如下:

    public class Investor : PropertyChangedNotification
        {
            [Key]
            public long InvestorId { get; set; }        
    
            [NotMapped]
            [ForeignKey("ImageData")]
            public List<int> ImageDataList { get; set; }
    
            public virtual ICollection<ImageData> ImageDataCollection { get; set; }
            public virtual ICollection<Investment> Investments { get; set; }        
        }
    

    我的投资类看起来像这样:

     public class Investment : PropertyChangedNotification
        {
            [Key]
            public long InvestmentId { get; set; }
    
           [ForeignKey("Investor")]
           [Required]
           public long FirstInvestorId { get; set; }       
    
    
            [NotMapped]
            [ForeignKey("ImageData")]
            public List<int> ImageDataList { get; set; }
    
            public virtual ICollection<ImageData> ImageDataCollection { get; set; }       
    
            public virtual Investor Investor { get; set; }
    
            [NotMapped]
            [Required (ErrorMessage = "First Investor is Required")]
            public Investor FirstInvestor { get; set; }
        }
    

    这是我的相关流畅配置:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                // MyData Database does not pluralize table names
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    
                modelBuilder.Entity<Investor>().HasOptional(s => s.ImageDataCollection);
                modelBuilder.Entity<Investment>().HasOptional(s => s.ImageDataCollection);
                //modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
            }
    

    当我开始调试应用程序时,出现以下错误:

    1. ImageData_Investment_Source :: Multiplicity在Role&#39; ImageData_Investment_Source&#39;中无效。在关系&#39; ImageData_Investment&#39;。由于“从属角色”属性不是关键属性,因此从属角色的多重性的上限必须为“&#39; *&#39;
    2. ImageData_Investor_Source :: Multiplicity在Role&#39; ImageData_Investor_Source&#39;中无效。在关系&#39; ImageData_Investor&#39;。由于“从属角色”属性不是关键属性,因此从属角色的多重性的上限必须为&#39; *&#39;
    3. 有人可以建议我解决这个问题和/或达到我需要的最佳方法,我真的很感激。 感谢

1 个答案:

答案 0 :(得分:2)

流畅的配置

modelBuilder.Entity<Investor>().HasOptional(s => s.ImageDataCollection);
modelBuilder.Entity<Investment>().HasOptional(s => s.ImageDataCollection);

不完整。

由于您已经拥有必要的数据注释和导航/ FK属性,因此您只需将其删除即可。或者,如果您想提供流畅的配置(我个人更喜欢,因为它允许您明确指定所有内容而不依赖于约定,特别是关系,而不是那么直观的ForegnKeyInverseProperty数据注释),那么你应该确保它完全反映了所涉及实体中导航和FK属性的存在/缺失。

到目前为止反映您模型的正确流畅配置如下:

modelBuilder.Entity<Investor>()
    .HasMany(e => e.ImageDataCollection)
    .WithOptional(e => e.Investor)
    .HasForeignKey(e => e.InvestorId);

modelBuilder.Entity<Investment>()
    .HasMany(e => e.ImageDataCollection)
    .WithOptional(e => e.Investment)
    .HasForeignKey(e => e.InvestmentId);