外键绑定到对象

时间:2019-05-03 18:29:01

标签: c# entity-framework .net-core entity-framework-6

我创建了一些模型,该模型应该将GUID(字符串)存储为标识符,并且我希望带有外键的类也具有要访问的对象。我记得使用LinqToSql时非常简单,但是现在我在使用EF时遇到了一些麻烦。

我尝试将对象设置为虚拟对象,但是我认为我必须在DbContext上做一些事情,因为当我尝试创建迁移时,由于递归限制而导致失败(我猜这是由于进行了某种循环引用)

例如,我有以下课程:

public class Calculation
{
    [Required]
    public Guid Id { get; set; }

    [Required]
    public Guid UserId { get; set; }

    [ForeignKey("UserId")]
    public virtual User User { get; set; }

    [Required]
    public string Title { get; set; }

    [Required]
    public Guid CausativeId { get; set; }

    [ForeignKey("CausativeId")]
    public virtual Causative Causative { get; set; }

    [Required]
    public bool Active { get; set; }
}
public class Causative
{
    [Required]
    public Guid Id { get; set; }

    [Required]
    public string Document { get; set; }

    public virtual Calculation Calculation { get; set; }
}

这个想法是,Calculation知道是谁引起的,但是我也希望能够以其他方式做到这一点(这在LinqToSql上非常有用),如果不可能的话,只需自动填充原因属性和相应的数据,而无需显式调用数据库。

我应该在DbContext实例中做什么吗?我已经准备好了:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<Calculation>().HasOne(calculation => calculation.Causative).WithOne(causative => causative.Calculation);
}

我确定自己做错了什么,但是不确定什么。

多谢指教!

2 个答案:

答案 0 :(得分:0)

对于您创建的模型,应将其更改为OnModelCreating:

modelBuilder.Entity<Causative>()
            .HasOne(p => p.Calculation)
            .WithOne(i => i.Causative)
            .HasForeignKey<Calculation>(b => b.CausativeId);

如果因果关系中有IEnumerable<Calculation>,则这是一对多的操作:

 modelBuilder.Entity<Calculation>()
                .HasOne(p => p.Causative)
                .WithMany(b => b.Calculation);

答案 1 :(得分:0)

我认为您只需要替换此行:

public virtual Calculation Calculation { get; set; }

与此:

public virtual List<Calculation> Calculations { get; set; }

或者这个:

public virtual ICollection<Calculation> Calculations { get; set; }

这将为您创建正确的导航属性和FK