簡體   English   中英

實體框架一對一關系先添加代碼的實體

[英]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列是外鍵,因此它的值指向InteractiveObjectID

更新

IndicatorId設為外鍵還會強制約束它是一對一或零關系,而如果InteractiveObject IndicatorId是外鍵,則它似乎是一對零或許多關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM