使用Fluent配置关系时出错

本文关键字:出错 关系 配置 Fluent 使用 | 更新日期: 2023-09-27 18:24:01

我在尝试为现有表配置实体和关系时遇到以下错误:

Models.Foo_Bar::多重性与冲突角色"Foo_Bar_Target"中的引用约束关系"Foo_Bar"中。因为所有Dependent Role中的属性不可为null主体角色必须为"1"。

我试图建模的系统是,如果用户有一个Foo,它会赋予零个或更多的Bar,相反,用户可能有一个没有相应FooBar

表格配置如下:

(不确定它是否相关,但实际上有几种不同类型的Foo可以映射到BarFoo使用DB中每个层次的表来表示)

用户:

Id INT NOT NULL IDENTITY(1, 1)

UserFoo:

Id INT NOT NULL IDENTITY (1, 1)
UserId INT NOT NULL
//Below is to do with TPH implementation, hopefully not 
//relevant here but included for sake of completeness
FooType1Id INT NULL 
FooType2Id INT NULL

UserBar:

UserId INT NOT NULL 
UserFooId INT NULL
BarId INT NOT NULL

映射这一点的实体类如下:

public abstract class UserFoo
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<Bar> Bars { get; set; }
}
public class UserBar
{
    public int UserId { get; set; }
    public int? UserFooId { get; set; }
    public int BarId { get; set; }
    public virtual User User { get; set; }
    public virtual UserFoo UserFoo { get; set; }
    public virtual Bar Bar { get; set; }
}

映射是这样完成的:

public class UserFooMap : EntityTypeConfiguration<UserFoo>
{
    public UserFooMap()
    {
        // Primary Key
        this.HasKey(t => t.Id);
        // Properties
        this.Property(t => t.UserId).IsRequired();
        // Table & Column Mappings
        this.ToTable("UserFoo", "User");
        this.Property(t => t.Id).HasColumnName("Id");
        this.Property(t => t.UserId).HasColumnName("UserId");
        // Relationships
        this.HasMany(t => t.UserBar)
            .WithOptional(t => t.UserFoo)
            .HasForeignKey(t => t.UserFooId);
    }
}
public class UserBarMap : EntityTypeConfiguration<UserBar>
{
    public UserBarMap()
    {
        // Primary Key
        this.HasKey(t => new { t.UserId, t.BarId, t.UserFooId });
        // Table & Column Mappings
        this.ToTable("UserBar", "User");
        this.Property(t => t.UserId).HasColumnName("UserId");
        this.Property(t => t.UserFooId).HasColumnName("UserFooId");
        this.Property(t => t.BarId).HasColumnName("BarId");
        // Relationships
        this.HasOptional(t => t.UserFoo)
            .WithMany(t => t.UserBar)
            .HasForeignKey(t => t.UserFooId);
    }
}

从这个错误来看,我认为这个问题是由UserFooIdUserBar上可以为null引起的,但我在这里看不到错误。我对代码优先(从技术上讲,我知道这不是因为我们试图映射到现有的DB)和每层次表以及

使用Fluent配置关系时出错

都比较陌生

问题出在UserBar表上,数据库中的列UserFooId未设置为Null。一旦此列被正确设置为可为null,一切都会正常工作。