我正在努力在三个表之间的Entity框架中创建一个关系.. 我正在使用C#,Sqlite 3.0和Entity Framework 6开发WPF应用程序。
我有以下表格(类):
我想创建一个模型,以便投资者和投资(以及未来的其他类)可以存储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>();
}
当我开始调试应用程序时,出现以下错误:
有人可以建议我解决这个问题和/或达到我需要的最佳方法,我真的很感激。 感谢
答案 0 :(得分:2)
流畅的配置
modelBuilder.Entity<Investor>().HasOptional(s => s.ImageDataCollection);
modelBuilder.Entity<Investment>().HasOptional(s => s.ImageDataCollection);
不完整。
由于您已经拥有必要的数据注释和导航/ FK属性,因此您只需将其删除即可。或者,如果您想提供流畅的配置(我个人更喜欢,因为它允许您明确指定所有内容而不依赖于约定,特别是关系,而不是那么直观的ForegnKey
和InverseProperty
数据注释),那么你应该确保它完全反映了所涉及实体中导航和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);