请问如下 projectUser表是双主键(projectId,userId).其中projectId既是主键又是外键。怎么样设置与project表ID的关联呢。如果我在projectUser中加ID作为主键是可以的,但是设计数据表时这样是不允许的。
public class Project
{
public Guid ID { get; set; }
public string ProjectName { get; set; }
}
public class ProjectUser
{
public Guid ProjectID { get; set; }
public string UserID { get; set; }
public virtual Project Project { get; set; }
}
以上异常信息如下:
One or more validation errors were detected during model generation:
System.Data.Edm.EdmEntityType: : EntityType 'ProjectUser' has no key defined. Define the key for this EntityType.
System.Data.Edm.EdmEntitySet: EntityType: EntitySet �ProjectUser� is based on type �ProjectUser� that has no keys defined.
数据库不允许的设置,CODE FIRST也是实现不了。CODE FIRST无非就是将EDMX文件变成类映射。所以两者结果是一致的,在没有CODE FIRST的时候,EF是将EDM这个XML文件解析类映射,现在CODE FIRST只是提供了一种解决映射的方式,因为EDM直接看XML是很乱的,只能借助VS的视图来看,所以有局限性。你这种情我觉得你所说的这张表肯定是一张中间表ProjectRelateUser
记录了ProjectID ,UserID 分别关联Project/User两张表。而ProjectRelateUser中ProjectID ,UserID 两个字段又构成了一个主键,禁止重复吧。这种情你只要保证ProjectID关联Project ,UserId关联User,EF在处理更新时ProjectRelateUser 不会出现重复的数据的。只有一种可能,你人为的往ProjectRelateUser 插入了数据, 中间表的数据EF会自动产生的。
是的,userID是主键,但是UserID并没有关联的表,这个字段不是外键。 projectID是主键的同时也是外键关联到project的ID.
@fantasy8341:如果你看到数据库不充许的设置,CodeFirst也实现不了,这个时候你就要考虑表要重新设计了。
ProjectUser这个好像最好再定义一个ID作为主键吧?
ProjectUser你没有使用[Key]关键字。
然后就是:你最好使用Fluent API试一试
modelBuilder.Entery<Project>().HasOptional<ProjectUser>(m=>m.ProjectUser).WithRequiredDepartment(m=>m.Project);
参考这个试试:http://msdn.microsoft.com/en-us/library/hh295843(v=VS.103).aspx
我按照你说的做了先加了[Key] 然后设置外键
modelBuilder.Entity<ProjectUser>().HasRequired(pu => pu.Project).WithMany(p => p.ProjectUser).HasForeignKey(pu => pu.ProjectID);
报错如下:
One or more validation errors were detected during model generation:
System.Data.Edm.EdmAssociationEnd: : Multiplicity is not valid in Role 'ProjectUser_Project_Source' in relationship 'ProjectUser_Project'. Because the Dependent Role refers to the key properties, the upper bound of the multiplicity of the Dependent Role must be �1�.
@fantasy8341:
是一对多的关系啊,那就不成了,你还是在加一个字段为主键吧
奇怪的最佳答案,明明可以简简单单解决的:
1 public class Project 2 { 3 [Key] 4 public Guid ID { get; set; } 5 public string ProjectName { get; set; } 6 } 7 public class ProjectUser 8 { 9 [Key, Column(Order=0)] 10 public Guid ProjectID { get; set; } 11 [Key, Column(Order=1)] 12 public string UserID { get; set; } 13 [ForeignKey("ProjectID")] 14 public virtual Project Project { get; set; } 15 }