gpt4 book ai didi

c# - EntityFramework 1对0、1对或多对关系

转载 作者:行者123 更新时间:2023-12-01 19:53:15 26 4
gpt4 key购买 nike

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

我有以下表格(类):

  1. 投资者
  2. 投资
  3. 图像存储

我想创建一个模型,以便投资者和投资(以及 future 的其他类)可以存储 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 或 Many 关系,我又创建了一个名为: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::多重性在关系“ImageData_Investment”中的角色“ImageData_Investment_Source”中无效。由于从属角色属性不是关键属性,因此从属角色的重数上限必须为“*”
  2. ImageData_Investor_Source::多重性在关系“ImageData_Investor”中的角色“ImageData_Investor_Source”中无效。由于从属角色属性不是关键属性,因此从属角色的重数上限必须为“*”

有人可以建议我解决这个问题和/或实现我需要的最佳方法吗,我真的很感激。谢谢

最佳答案

流畅的配置

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

不完整。

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

到目前为止反射(reflect)您模型的正确流畅配置如下所示:

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);

关于c# - EntityFramework 1对0、1对或多对关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43618155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com