Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体尝试在我只需要引用时创建子实体_C#_Asp.net_Asp.net Core_.net Core_Entity Framework Core - Fatal编程技术网

C# 实体尝试在我只需要引用时创建子实体

C# 实体尝试在我只需要引用时创建子实体,c#,asp.net,asp.net-core,.net-core,entity-framework-core,C#,Asp.net,Asp.net Core,.net Core,Entity Framework Core,我一直在试图弄清楚ASP.net Core和Entity Framework Core在涉及子实体时是如何工作的。目前,我的问题是,我可以创建一个状态为完整实体的“某物”实体,同时插入这两个实体,但我不知道如何创建第二个链接到相同状态的“某物”,而不会抛出一个错误,说它已经存在 以下是我的模型和上下文代码: 主要类别: public class SomeThing { [Key] [DatabaseGenerated(DatabaseGeneratedOp

我一直在试图弄清楚ASP.net Core和Entity Framework Core在涉及子实体时是如何工作的。目前,我的问题是,我可以创建一个状态为完整实体的“某物”实体,同时插入这两个实体,但我不知道如何创建第二个链接到相同状态的“某物”,而不会抛出一个错误,说它已经存在

以下是我的模型和上下文代码:

主要类别:

public class SomeThing
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int SomeThingId { get; set; }

        public DateTime CreatedDate { get; set; }

        public DateTime? RequestedDate { get; set; }

        [Required(ErrorMessage = "Description is required.")]
        public string Description { get; set; }

        [Required]
        public int CreatedBy { get; set; }

        public bool? Archived { get; set; }

        //Linked items
        [Required(ErrorMessage = "Status is required.")]
        [ForeignKey("StatusCode")]
        public Status Status { get; set; }
    }
儿童班:

public class Status
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public string Code { get; set; }

        [Required(ErrorMessage = "The status requires a description")]
        public string Description { get; set; }

        public Status()
        {
        }
    }
背景:

public class OCWRContext : DbContext
    {
        public DbSet<Status> Statuses { get; set; }
        public DbSet<SomeThing> WorkRequests { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {

            modelBuilder.Entity<SomeThing>(entity =>
            {
                entity.HasKey(st => st.SomeThingId);
                entity.Property<int>("SomeThingId")
                    .ValueGeneratedOnAdd();
                entity.Property<byte[]>("Version")
                    .IsRowVersion();
                entity.HasOne(st => st.Status)
                      .WithMany()
                      .OnDelete(DeleteBehavior.Restrict);
            });

            modelBuilder.Entity<Status>(entity =>
            {
                //entity.HasKey(s => s.Code);
                //entity.HasMany(s => s.Code)
                      //.WithOne();

            });

        } 

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySQL(connectionString);
        }
    }
非常感谢您能帮助我重新走上正确的方向!如果你需要我提供的任何其他信息来帮助你,请告诉我。现在我非常想弄明白这一点

提前感谢,

史蒂夫

如何创建第二个链接到相同状态的“某物”,而不抛出一个表示它已经存在的错误

你所遇到的叫做

…有时使用一个上下文实例查询实体,然后使用另一个实例保存实体

…在这种情况下,第二个上下文实例需要知道实体是新的(应该插入)还是现有的(应该更新)

在您的情况下,如果数据库已经具有
状态
code==“a”
,则您不能添加具有相同
代码的
新状态
。在不更改上下文或模型的情况下,您可以执行以下操作:

  • 查找具有给定
    代码的
    状态
  • 如果未找到
    状态
    ,则创建一个
    新状态
  • 将第1步或第2步中的
    状态设置为
    新内容
  • 上述步骤的示例代码:

    using (var context = new OCWRContext())
    {
        string statusCode = "A";
    
        Status status =
            context.Statuses.Find(statusCode) //Step 1
            ?? context.Statuses.Add(new Status { Code = statusCode, Description = "" }).Entity; //Step 2
    
        var someThing = new SomeThing
        {
            Status = status, //Step 3
            Description = ""
        };
    
        context.Add(someThing);
        context.SaveChanges();
    }
    

    啊,所以它认为它是新的,因为它没有元数据或来自查询的东西?那很有趣。如果我更改了模型/上下文,技术上是否有更好的方法?它们没有被锁定,因为这是一个新的应用程序,所以我有能力更改它们。是的,可以将其视为在
    状态
    实例上执行
    ReferenceEquals
    ,因此即使其中两个具有相同的
    code
    ,它们实际上引用的是不同的实例。好的,现在我在办公室,我将对此进行测试。谢谢你澄清发生了什么事!
    using (var context = new OCWRContext())
    {
        string statusCode = "A";
    
        Status status =
            context.Statuses.Find(statusCode) //Step 1
            ?? context.Statuses.Add(new Status { Code = statusCode, Description = "" }).Entity; //Step 2
    
        var someThing = new SomeThing
        {
            Status = status, //Step 3
            Description = ""
        };
    
        context.Add(someThing);
        context.SaveChanges();
    }