【发布时间】:2018-03-31 18:05:09
【问题描述】:
我目前正在开发一个项目(WCF 服务),该项目应该将 EF6 与 MySql 数据库结合使用。该部分本身已经在正常工作,但是我在映射方面遇到了很大的问题。
我有 3 个实体,如下所示:
Employee - ManyToMany - Project - OneToMany - ProjectStep
我的数据库模型是这样设置的:
员工表:
CREATE TABLE `employee` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(255) DEFAULT NULL,
`JobDescription` varchar(255) DEFAULT NULL,
`Department` varchar(255) DEFAULT NULL,
`DirectDialing` varchar(255) DEFAULT NULL,
`Status` bit(1) DEFAULT NULL,
PRIMARY KEY (`ID`)
)
项目表:
CREATE TABLE `project` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Titel` varchar(255) DEFAULT NULL,
`StartDate` datetime DEFAULT NULL,
`EndDate` datetime DEFAULT NULL,
`Description` varchar(255) DEFAULT NULL,
`ProjectLeader` int(11) DEFAULT NULL,
`Status` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`),
CONSTRAINT `project_fk` FOREIGN KEY (`ProjectLeader`) REFERENCES `employee` (`ID`)
)
ProjectStep 表:
CREATE TABLE `project_step` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Description` text,
`StartDate` datetime DEFAULT NULL,
`EndDate` datetime DEFAULT NULL,
`Project` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`),
CONSTRAINT `project_step_fk` FOREIGN KEY (`Project`) REFERENCES `project` (`ID`)
)
映射表员工 - 项目
CREATE TABLE `employee_project` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`EmployeeId` int(11) DEFAULT NULL,
`ProjectId` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`),
CONSTRAINT `projectId_fk` FOREIGN KEY (`ProjectId`) REFERENCES `project` (`ID`)
CONSTRAINT `employeeId_fk` FOREIGN KEY (`EmployeeId`) REFERENCES `employee` (`ID`)
)
然后我创建了我的实体如下:
[DataContract(Namespace = "Shared")]
public class Employee
{
public Employee()
{
this.Projects = new List<Project>();
}
[DataMember]
[Key]
public int ID { get; set; }
[DataMember]
public String Name { get; set; }
[DataMember]
public String Berufsbezeichnung { get; set; }
[DataMember]
public String Abteilung { get; set; }
[DataMember]
public String Durchwahl { get; set; }
[DataMember]
public bool Status { get; set; }
[DataMember]
public virtual ICollection<Project> Projects { get; set; }
}
[DataContract(Namespace = "Shared")]
public class Project
{
public Project()
{
this.EmployeesWorkingOnProject = new List<Employee>();
this.ProjectSteps = new List<ProjectStep>();
}
[DataMember]
[Key]
public int ID { get; set; }
[DataMember]
public String Titel { get; set; }
[DataMember]
public DateTime StartDatum { get; set; }
[DataMember]
public DateTime EndDatum { get; set; }
[DataMember]
public String Beschreibung { get; set; }
[DataMember]
[Column("Projektleiter")]
public Employee Projektleiter { get; set; }
[DataMember]
public bool Status { get; set; }
[DataMember]
public virtual ICollection<Employee> EmployeesWorkingOnProject { get; set; }
[DataMember]
[ForeignKey("Project")]
public virtual ICollection<ProjectStep> ProjectSteps { get; set; }
}
[DataContract(Namespace = "Shared")]
public class ProjectStep
{
[DataMember]
public int ID { get; set; }
[DataMember]
public String Beschreibung { get; set; }
[DataMember]
public DateTime StartDatum { get; set; }
[DataMember]
public DateTime EndDatum { get; set; }
[DataMember]
public Project Project { get; set; }
}
并使用Fluent API 创建ManyToMany 关系以及OneToMany:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Employee>().HasMany(e => e.Projects).WithMany(t => t.EmployeesWorkingOnProject).Map(m =>
{
m.MapLeftKey("MitarbeiterID");
m.MapRightKey("ProjektID");
m.ToTable("mitarbeiter_projekte");
});
modelBuilder.Entity<ProjectStep>().HasRequired<Project>(p => p.Project).WithMany(p => p.ProjectSteps);
}
我真的很茫然,因为当我尝试插入一个新的Project 时,我得到了错误:
类型上属性“ProjectSteps”的 ForeignKeyAttribute “Shared.Project”无效。外键名称“项目”不是 在依赖类型“Shared.ProjectStep”上找到。名称值 应该是逗号分隔的外键属性名称列表。
我认为我的映射中存在一些问题,这是导致此错误的原因。我完全不知道我的映射在哪里出错,甚至我是否使用了正确的方法。
所以我的问题是,是否应该将DataAnnotations 与Fluent API 混合使用,有人可以帮我正确映射吗?
请注意,这是我的第一个 C#/EF6 项目,我对所有内容都不是很常见,因此欢迎提供一些解释。
【问题讨论】:
-
我认为您需要使用
Id字段作为外键,例如ProjectId。收藏不能成为钥匙,不是吗?我只比你稍微熟悉一点,但似乎你不应该先用 Fluent 做一些,用 DataAnnotations 做一些,而先通过数据做一些。您可以通过这三种方式中的任何一种来设置约束,那么为什么不将它们全部合二为一呢? -
@Tim 出于某种原因
data first在我的 VS 中不起作用。DataAnnotations还需要一个实体来映射ManyToMany对吗?
标签: c# .net entity-framework ef-fluent-api