我创建了一些模型,该模型应该将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);
}
我确定自己做错了什么,但是不确定什么。
多谢指教!
答案 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