文章内容

2017/3/26 9:35:42,作 者: 黄兵

Dependent Role 多重性的上限必须为“1”

今天在写代码报错,如下提示:

模型生成过程中检测到一个或多个验证错误:
FirstProject_SecondProjects_Target: : 关系“FirstProject_SecondProjects”中 Role“FirstProject_SecondProjects_Target”的多重性无效。因为 Dependent Role 引用的是键属性,Dependent Role 多重性的上限必须为“1”。

以前写代码也遇到过这种错误,一直扔在那里没有管,直到今天才把这个问题给解决了,先看一下原来的代码:

一级目录代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
 
namespace _8677333.AppDAL.Entities
{
    public class FirstProject
    {
        public FirstProject()
        {
            SecondProjects = new HashSet<SecondProject>();
        }
 
        public int Id { getset; }
        public string FirstProName { getset; }
        public DateTime CreationTime { getset; }
 
        public ICollection<SecondProject> SecondProjects { getset; }
    }
}

二级目录代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
namespace _8677333.AppDAL.Entities
{
    public class SecondProject
    {
        public int Id { getset; }
        public string SecondProName { getset; }
 
        public virtual FirstProject FirstProjects { getset; }
    }
}

之后生成数据库代码如下(采用Fluent API的方式生成):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public virtual DbSet<FirstProject> FirstProject { getset; }
        public virtual DbSet<SecondProject> SecondProject { getset; }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //FirstProject和SecondProject之间一对多关系
            modelBuilder.Entity<FirstProject>()
                .HasMany(c => c.SecondProjects)
                .WithRequired(c => c.FirstProjects)
                .HasForeignKey(c => c.Id)
                .WillCascadeOnDelete(false);
 
            base.OnModelCreating(modelBuilder);
        }

之后提示这个错误。

解决方案如下:

二级目录更改的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
namespace _8677333.AppDAL.Entities
{
    public class SecondProject
    {
        public int Id { getset; }
        public string SecondProName { getset; }
//注意:在这里的改变
        public int FirstProId { getset; }
 
        public virtual FirstProject FirstProjects { getset; }
    }
}

Fluent API的方式生成数据库代码改变如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public virtual DbSet<FirstProject> FirstProject { getset; }
        public virtual DbSet<SecondProject> SecondProject { getset; }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //FirstProject和SecondProject之间一对多关系
            modelBuilder.Entity<FirstProject>()
                .HasMany(c => c.SecondProjects)
                .WithRequired(c => c.FirstProjects)
                //注意:这里的代码改变
                .HasForeignKey(c => c.FirstProId)
                .WillCascadeOnDelete(false);
 
            base.OnModelCreating(modelBuilder);
        }
这里FirstProject 的Id是主键,而SecondProject 的Id既是主键又是外键,之后给SecondProject 指定一个外键:FirstProId。

这样就不会产生多重性无效(二义性)了。

分享到:

发表评论

评论列表