首页 新闻 搜索 专区 学院

code frist 外键的问题

1
悬赏园豆:80 [已解决问题] 解决于 2011-10-02 11:55

请问如下 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.
fantasy8341的主页 fantasy8341 | 初学一级 | 园豆:89
提问于:2011-09-28 14:09
< >
分享
最佳答案
3

数据库不允许的设置,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会自动产生的。

收获园豆:40
小城岁月 | 菜鸟二级 |园豆:260 | 2011-09-28 22:34

是的,userID是主键,但是UserID并没有关联的表,这个字段不是外键。 projectID是主键的同时也是外键关联到project的ID.

fantasy8341 | 园豆:89 (初学一级) | 2011-09-29 16:52

@fantasy8341:如果你看到数据库不充许的设置,CodeFirst也实现不了,这个时候你就要考虑表要重新设计了。

小城岁月 | 园豆:260 (菜鸟二级) | 2011-09-30 08:55
其他回答(3)
0

ProjectUser这个好像最好再定义一个ID作为主键吧?

lanvv | 园豆:205 (菜鸟二级) | 2011-09-28 20:07
0

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

收获园豆:40
吼吼吼 | 园豆:73 (初学一级) | 2011-09-28 20:56

我按照你说的做了先加了[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�.

 

支持(0) 反对(0) fantasy8341 | 园豆:89 (初学一级) | 2011-09-29 16:49

@fantasy8341:

是一对多的关系啊,那就不成了,你还是在加一个字段为主键吧

支持(0) 反对(0) 吼吼吼 | 园豆:73 (初学一级) | 2011-09-29 18:18
3

奇怪的最佳答案,明明可以简简单单解决的:

 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     }
ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-18 08:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册