一对多导航 属性 不工作

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();