C# 实体尝试在我只需要引用时创建子实体
我一直在试图弄清楚ASP.net Core和Entity Framework Core在涉及子实体时是如何工作的。目前,我的问题是,我可以创建一个状态为完整实体的“某物”实体,同时插入这两个实体,但我不知道如何创建第二个链接到相同状态的“某物”,而不会抛出一个错误,说它已经存在 以下是我的模型和上下文代码: 主要类别: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
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();
}