我有一个多对多与一些主从数据网格设置混合。
- 4 数据网格视图
- 6 个实体(2 个映射表)
- 5 数据关系
为了给您一个直观的图像,有 1 个大的 Employe DGV (DataGridView) 和 3 个较小的根据 Employe DGV 选择的行进行更新。
3 个较小的网格之一是没有映射表的非常简单的关系。
然而,另外 2 个显示一个映射表行,它使用它映射到的实体的格式化信息。那些 2 DGV 只有 1 列,一个带有格式化字符串(覆盖.ToString()
)的 ComboBox,它(应该)具有映射指向的基础对象(EF 将在接收整个对象时相应地处理设置 ID)。但是,当我尝试添加新行时,它会说它无法将 String 转换为Put Object Name Here。这让我想到,如果您没有设置 ValueMember,组合框会尝试使用 .ToString() 获取字符串表示形式。Self
所以我试图通过向简单地返回自己的实体添加一个属性来绕过这种行为。没有成功,它仍在尝试在某处转换字符串。
确切的错误(法语)是:
System.FormatException: Cast non valide de 'System.String' en 'InvInformatique.logiciels'.
翻译到“从 System.String 到 InvInformatique.logiciels 的无效转换。
代码
InventaireInformatiqueEntities iidb = new InventaireInformatiqueEntities();
bsEmployes.DataSource = iidb.employes;
bsMateriels.DataSource = iidb.materiels;
bsLogiciels.DataSource = iidb.logiciels;
bsLogicielEmployeMaps.DataSource = iidb.logiciel_employe_maps; // Needed to provoke the load query
bsAcces.DataSource = iidb.acces;
bsAccesEmployeMaps.DataSource = iidb.acces_employe_maps; // Needed to provoke the load query
dgvEmployes.AutoGenerateColumns = false;
dgvEmployes.Columns.AddRange(
new DataGridViewTextBoxColumn { Name = "Nom", DataPropertyName = "nom" },
new DataGridViewTextBoxColumn { Name = "Département", DataPropertyName = "departement" }
);
dgvEmployeMateriels.AutoGenerateColumns = false;
dgvEmployeMateriels.Columns.AddRange(
new DataGridViewTextBoxColumn { HeaderText = "Nom", DataPropertyName = "nom" },
new DataGridViewTextBoxColumn { HeaderText = "Satisfaction", Name = "satisfaction", DataPropertyName = "satisfaction" }
);
dgvEmployeAcces.AutoGenerateColumns = false;
dgvEmployeAcces.Columns.AddRange(
new DataGridViewComboBoxColumn { HeaderText = "Accès", DataPropertyName = "acces", DataSource = bsAcces }
);
dgvEmployeLogiciel.AutoGenerateColumns = false;
dgvEmployeLogiciel.Columns.AddRange(
new DataGridViewComboBoxColumn { HeaderText = "Logiciels", DataPropertyName = "logiciels", DataSource = bsLogiciels }
);
dgvEmployes.DataSource = bsEmployes;
dgvEmployeMateriels.DataBindings.Add(new Binding("DataSource", bsEmployes, "materiels"));
dgvEmployeLogiciel.DataBindings.Add(new Binding("DataSource", bsEmployes, "logiciel_employe_maps"));
dgvEmployeAcces.DataBindings.Add(new Binding("DataSource", bsEmployes, "acces_employe_maps"));
数据库
Employes
->id
->nom
->departement
Acces
->id
->nom
->description
Logiciel
->id
->nom
Materiel
->id
->employe_id
->nom
->description
Acces_Employe_Maps
->id
->acces_id
->employe_id
Logiciel_Employe_Maps
->id
->logiciel_id
->employe_id
数据库关系
Employes <-> Logiciel_Employe_Maps <-> Logiciels
Employes <-> Acces_Employe_Maps <-> Acces
Employes -> Materiel