[英]Entity Framework One To One Relation Adding Entity with code first
我有两个班级,他们的关系如下:
public class InteractiveObject
{
public int Id {get; set;}
public string Name{ get; set; }
public int? IndicatorId { get; set; }
public virtual Indicator Indicator { get; set; }
}
public class Indicator
{
public int Id {get; set;}
public string Name{ get; set; }
public int InteractiveObjectId { get; set; }
public virtual InteractiveObject InteractiveObject { get; set; }
}
我像这样配置
modelBuilder.Entity<Indicator>().HasRequired(x => x.InteractiveObject)
.WithOptional(x => x.Indicator);
它创建两个表,该表的指示符没有可为空的InteractiveObjectId,而表InteractiveObject的表具有可为空的IndicatorId。 完善。
但是,当我尝试使用InteractiveObject添加指标时。 表指示符包含所有信息,但是相关的InteractiveObject表不包含指示符ID。 我的意思是,InteractiveObject表上的IndicatorId为null,但指标表上的InteractiveObjectId不为null
代码如下:
modelBuilder.Entity<Indicator>().HasRequired(x => x.InteractiveObject)
.WithOptional(x => x.Indicator);
var selectedInteractiveObject = DbContext.Set<InteractiveObject>().FirstOrDefault(x => x.Id == 1);
var indicator = new Indicator { Name = "Test"};
selectedInteractiveObject.Indicator = indicator;
DbContext.SaveChanges();
由于我们具有one-to-zero or one
关系,因此我们不需要定义单独的键,因为它们可以共享相同的ID,但是Indicator
指的是InteractiveObject
。 这意味着InteractiveObject
可以不包含Indicator
而存在,反之亦然。
所以类对象应该是这样的:
public class Indicator
{
[ForeignKey("InteractiveObject")]
public int Id { get; set; }
public string Name { get; set; }
public virtual InteractiveObject InteractiveObject { get; set; }
}
public class InteractiveObject
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Indicator Indicator { get; set; }
}
您应该像这样从DbContext
继承上下文类:
public partial class YourContext: DbContext
{
static YourContext() { }
//Class constructor with Connection String name
public YourContext() : base("name=YourConnectionString") { }
public DbSet<Indicator> Indicators{ get; set; }
public DbSet<InteractiveObject> InteractiveObjects { get; set; }
}
现在,您可以通过一次性模式对其实例进行操作:
using (var context = new YourContext())
{
var selectedInteractiveObject = context.InteractiveObjects.FirstOrDefault(x => x.Id == 1);
var indicator = new Indicator { Name = "Test" };
selectedInteractiveObject.Indicator = indicator;
context.SaveChanges();
}
好吧,您正在寻找错误列中的值。
如果在运行迁移时应用了-Versbose
标志,则您会注意到以下SQL语句创建了外键约束。
ALTER TABLE [dbo].[Indicators] ADD CONSTRAINT [FK_dbo.Indicators_dbo.InteractiveObjects_Id] FOREIGN KEY ([Id]) REFERENCES [dbo].[InteractiveObjects] ([Id])
Indicator
Id
列是外键,因此它的值指向InteractiveObject
的ID
。
更新
将Indicator
的Id
设为外键还会强制约束它是一对一或零关系,而如果InteractiveObject
IndicatorId
是外键,则它似乎是一对零或许多关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.