一对多导航 属性 不工作
One-to-Many Navigation Property not working
所以我有两个 table,用户和评论。评论 table 在 users.user_key 上有一个外键约束。我正在尝试让 ReviewModel 中的导航 属性 Users 进行填充。反之亦然。我也无法在 UserModel 中获取 ICollection Reviews 属性 来填充。
用户模型
public class UserModel
{
public int UserKey { get; set; }
public virtual ICollection<ReviewModel> Reviews { get; set; }
}
用户配置
class UserConfiguration : EntityTypeConfiguration<UserModel>
{
public UserConfiguration()
{
this.ToTable("users", "sec");
this.HasKey(k => k.UserKey);
this.Property(p => p.UserKey)
.IsRequired()
.HasColumnName("user_key")
.HasColumnType("int");
this.HasMany(r => r.Reviews)
.WithOptional()
.HasForeignKey(k => k.UserKey);
//this.HasOptional(r => r.Reviews)
// .WithMany()
// .HasForeignKey(k => k.UserKey);
}
}
评论模型
public class ReviewModel
{
public int ReviewKey { get; set; }
public int UserKey { get; set; }
public virtual UserModel User { get; set; }
}
审查配置
public ReviewConfiguration()
{
this.ToTable("reviews", "dbo");
this.HasKey(k => k.ReviewKey);
this.Property(p => p.ReviewKey)
.HasColumnName("review_key")
.HasColumnType("int")
.IsRequired();
this.Property(p => p.UserKey)
.HasColumnName("user_key")
.HasColumnType("int")
.IsOptional();
this.HasRequired(p => p.User)
.WithMany(u => u.Reviews);
//this.HasRequired(p => p.User)
// .WithRequiredPrincipal()
// .Map(m => m.ToTable("users", "sec").MapKey("user_key"));
}
我的配置 classes 是分开的,假设我在 SQL 数据库中正确设置了外键。这是我的 DbContext class,我不断收到错误。
public class TestDbContext : DbContext
{
public DbSet<ReviewModel> reviews { get; set; }
public DbSet<UserModel> users { get; set; }
public TestDbContext() : base("name=TestConnection")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ReviewConfiguration());
modelBuilder.Configurations.Add(new UserConfiguration());
}
public IEnumerable<ReviewModel> getReviews()
{
try
{
IEnumerable<ReviewModel> reviews = (from r in this.reviews
select r).DefaultIfEmpty();
return reviews;
}
catch(SqlException ex)
{
throw ex;
}
}
}
每次我 运行 我都会收到这个错误。
The navigation property 'Reviews' declared on type 'NameSpace.Models.UserModel' has been configured with conflicting multiplicities.
我使用 this link 作为参考,我什至没有 HasOne() 或 WithOne() 的选项。
如果我删除所有导航属性,我可以填充 DbSet,所以这不是数据库连接问题。
所有注释掉的代码都是我试图让它工作的其他东西。
如果我注释掉 ReviewConfiguration 中的第一个 .HasRequired 并取消注释另一个 .HasRequired,我会收到此错误。
One or more validation errors were detected during model generation:
user_key: Name: Each property name in a type must be unique. Property name 'user_key' is already defined."
所以问题是有谁知道如何为 table A 设置 DbContext 配置,它在 table B 中有一个外键并且 Table A 可以有多个键关联到 Table B 中的单个键,而 table B 没有任何外键。
更新:
根据莱昂纳多的建议,我将配置更改为...
用户配置:
class UserConfiguration : EntityTypeConfiguration<UserModel>
{
public UserConfiguration()
{
this.ToTable("users", "sec");
this.HasKey(k => k.UserKey);
this.Property(p => p.UserKey)
.IsRequired()
.HasColumnName("user_key")
.HasColumnType("int");
this.HasMany(r => r.Reviews)
.WithRequired(u => u.User)
.HasForeignKey(k => k.UserKey);
}
}
审查配置
public class ReviewConfiguration : EntityTypeConfiguration<ReviewModel>
{
public ReviewConfiguration()
{
this.ToTable("trail_reviews", "dbo");
this.HasKey(k => k.ReviewKey);
this.Property(p => p.ReviewKey)
.HasColumnName("review_key")
.HasColumnType("int")
.IsRequired();
this.Property(p => p.UserKey)
.HasColumnName("user_key")
.HasColumnType("int")
.IsRequired();
this.HasRequired(p => p.User)
.WithMany(u => u.Reviews)
.HasForeignKey(k => k.UserKey);
}
}
现在构建了 ReviewModel 集合,但从未填充用户 属性。我检查了我的数据库,每个 table 中的 user_key 都是正确的,数据是正确的。我还在 ReviewConfiguration 上添加了 .HasForeignKey(),但是无论有没有它,用户 属性 都不会被填充。
此外,生成的 SQL 查询看起来根本不正确。貌似是外加审核table本身???
SELECT
[Project1].[review_key] AS [review_key],
[Project1].[user_key] AS [user_key]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN (SELECT
[Extent1].[review_key] AS [review_key],
[Extent1].[user_key] AS [user_key]
FROM [dbo].[reviews] AS [Extent1]) AS [Project1] ON 1 = 1
********* 更新 2 ********
好的,我在要返回的 IEnumerable 上放了一个 .ToList(),它填充了 User 属性。当我将它传递回视图时,它以某种方式丢失了,因为当我在我的剃刀视图中放置一个断点时,用户 属性 是一个错误。所以我要将 Leonardo 的回答标记为正确,因为他解决了我的配置问题。
您有评论
this.HasRequired(p => p.User)
.WithMany(u => u.Reviews);
这意味着..需要用户进行审核。
对于您拥有的用户
this.HasMany(r => r.Reviews)
.WithOptional()
.HasForeignKey(k => k.UserKey);
这意味着..用户在审核中是可选的。
改变
this.HasMany(r => r.Reviews)
.WithOptional()
.HasForeignKey(k => k.UserKey);
到
this.HasMany(r => r.Reviews)
.WithRequired(t=> t.UserModel)
.HasForeignKey(k => k.UserKey);
注意需要的用户模型
和
this.Property(p => p.UserKey)
.HasColumnName("user_key")
.HasColumnType("int")
.IsOptional();
到
this.Property(p => p.UserKey)
.HasColumnName("user_key")
.HasColumnType("int")
.IsRequired();
所以我有两个 table,用户和评论。评论 table 在 users.user_key 上有一个外键约束。我正在尝试让 ReviewModel 中的导航 属性 Users 进行填充。反之亦然。我也无法在 UserModel 中获取 ICollection Reviews 属性 来填充。
用户模型
public class UserModel
{
public int UserKey { get; set; }
public virtual ICollection<ReviewModel> Reviews { get; set; }
}
用户配置
class UserConfiguration : EntityTypeConfiguration<UserModel>
{
public UserConfiguration()
{
this.ToTable("users", "sec");
this.HasKey(k => k.UserKey);
this.Property(p => p.UserKey)
.IsRequired()
.HasColumnName("user_key")
.HasColumnType("int");
this.HasMany(r => r.Reviews)
.WithOptional()
.HasForeignKey(k => k.UserKey);
//this.HasOptional(r => r.Reviews)
// .WithMany()
// .HasForeignKey(k => k.UserKey);
}
}
评论模型
public class ReviewModel
{
public int ReviewKey { get; set; }
public int UserKey { get; set; }
public virtual UserModel User { get; set; }
}
审查配置
public ReviewConfiguration()
{
this.ToTable("reviews", "dbo");
this.HasKey(k => k.ReviewKey);
this.Property(p => p.ReviewKey)
.HasColumnName("review_key")
.HasColumnType("int")
.IsRequired();
this.Property(p => p.UserKey)
.HasColumnName("user_key")
.HasColumnType("int")
.IsOptional();
this.HasRequired(p => p.User)
.WithMany(u => u.Reviews);
//this.HasRequired(p => p.User)
// .WithRequiredPrincipal()
// .Map(m => m.ToTable("users", "sec").MapKey("user_key"));
}
我的配置 classes 是分开的,假设我在 SQL 数据库中正确设置了外键。这是我的 DbContext class,我不断收到错误。
public class TestDbContext : DbContext
{
public DbSet<ReviewModel> reviews { get; set; }
public DbSet<UserModel> users { get; set; }
public TestDbContext() : base("name=TestConnection")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ReviewConfiguration());
modelBuilder.Configurations.Add(new UserConfiguration());
}
public IEnumerable<ReviewModel> getReviews()
{
try
{
IEnumerable<ReviewModel> reviews = (from r in this.reviews
select r).DefaultIfEmpty();
return reviews;
}
catch(SqlException ex)
{
throw ex;
}
}
}
每次我 运行 我都会收到这个错误。
The navigation property 'Reviews' declared on type 'NameSpace.Models.UserModel' has been configured with conflicting multiplicities.
我使用 this link 作为参考,我什至没有 HasOne() 或 WithOne() 的选项。
如果我删除所有导航属性,我可以填充 DbSet,所以这不是数据库连接问题。
所有注释掉的代码都是我试图让它工作的其他东西。
如果我注释掉 ReviewConfiguration 中的第一个 .HasRequired 并取消注释另一个 .HasRequired,我会收到此错误。
One or more validation errors were detected during model generation:
user_key: Name: Each property name in a type must be unique. Property name 'user_key' is already defined."
所以问题是有谁知道如何为 table A 设置 DbContext 配置,它在 table B 中有一个外键并且 Table A 可以有多个键关联到 Table B 中的单个键,而 table B 没有任何外键。
更新: 根据莱昂纳多的建议,我将配置更改为...
用户配置:
class UserConfiguration : EntityTypeConfiguration<UserModel>
{
public UserConfiguration()
{
this.ToTable("users", "sec");
this.HasKey(k => k.UserKey);
this.Property(p => p.UserKey)
.IsRequired()
.HasColumnName("user_key")
.HasColumnType("int");
this.HasMany(r => r.Reviews)
.WithRequired(u => u.User)
.HasForeignKey(k => k.UserKey);
}
}
审查配置
public class ReviewConfiguration : EntityTypeConfiguration<ReviewModel>
{
public ReviewConfiguration()
{
this.ToTable("trail_reviews", "dbo");
this.HasKey(k => k.ReviewKey);
this.Property(p => p.ReviewKey)
.HasColumnName("review_key")
.HasColumnType("int")
.IsRequired();
this.Property(p => p.UserKey)
.HasColumnName("user_key")
.HasColumnType("int")
.IsRequired();
this.HasRequired(p => p.User)
.WithMany(u => u.Reviews)
.HasForeignKey(k => k.UserKey);
}
}
现在构建了 ReviewModel 集合,但从未填充用户 属性。我检查了我的数据库,每个 table 中的 user_key 都是正确的,数据是正确的。我还在 ReviewConfiguration 上添加了 .HasForeignKey(),但是无论有没有它,用户 属性 都不会被填充。
此外,生成的 SQL 查询看起来根本不正确。貌似是外加审核table本身???
SELECT
[Project1].[review_key] AS [review_key],
[Project1].[user_key] AS [user_key]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN (SELECT
[Extent1].[review_key] AS [review_key],
[Extent1].[user_key] AS [user_key]
FROM [dbo].[reviews] AS [Extent1]) AS [Project1] ON 1 = 1
********* 更新 2 ******** 好的,我在要返回的 IEnumerable 上放了一个 .ToList(),它填充了 User 属性。当我将它传递回视图时,它以某种方式丢失了,因为当我在我的剃刀视图中放置一个断点时,用户 属性 是一个错误。所以我要将 Leonardo 的回答标记为正确,因为他解决了我的配置问题。
您有评论 this.HasRequired(p => p.User) .WithMany(u => u.Reviews);
这意味着..需要用户进行审核。
对于您拥有的用户
this.HasMany(r => r.Reviews)
.WithOptional()
.HasForeignKey(k => k.UserKey);
这意味着..用户在审核中是可选的。
改变
this.HasMany(r => r.Reviews)
.WithOptional()
.HasForeignKey(k => k.UserKey);
到
this.HasMany(r => r.Reviews)
.WithRequired(t=> t.UserModel)
.HasForeignKey(k => k.UserKey);
注意需要的用户模型
和
this.Property(p => p.UserKey)
.HasColumnName("user_key")
.HasColumnType("int")
.IsOptional();
到
this.Property(p => p.UserKey)
.HasColumnName("user_key")
.HasColumnType("int")
.IsRequired();