实体框架一对一关系首先使用代码添加实体

时间:2015-04-10 06:36:47

标签: c# .net entity-framework

我有两个班级,他们的关系如下:

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

它创建了两个表,其中表Indicator没有可空的InteractiveObjectId,而表InteractiveObject具有可为空的IndicatorId。完美。

但是当我尝试使用InteractiveObject添加Indicator时。表Indicator包含所有信息,但相关的InteractiveObject表不包含IndicatorId。我的意思是InteractiveObject表上的IndicatorId为空,但指标表

上的InteractiveObjectId不为空

代码如下:

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

2 个答案:

答案 0 :(得分:1)

由于我们之间存在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();
}

答案 1 :(得分:0)

好吧,你正在寻找错误列中的值。

如果在运行迁移时已应用-Versbose标志,则会注意到以下SQL语句创建了外键约束。

ALTER TABLE [dbo].[Indicators] ADD CONSTRAINT [FK_dbo.Indicators_dbo.InteractiveObjects_Id] FOREIGN KEY ([Id]) REFERENCES [dbo].[InteractiveObjects] ([Id])
Id的{​​{1}}列是外键,因此它的值会指向Indicator的{​​{1}}。

<强>更新

ID InteractiveObject作为外键也强制约束它是一对一或零关系,而Id中的Indicator是外键它似乎是一个零或多个关系。