将对象指定给另一个对象

本文关键字:一个对象 对象 | 更新日期: 2023-09-27 18:35:19

在我的应用程序中,一个人可以拥有神赐给他们的守护神。最初他们没有。守护神只存在于一个人身上,所以这个人一定已经被创造了。

这些是我的课程:

public class Person {
    public int PersonID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public virtual GuardianSpirit GuardianSpirit { get; set; }
}
public class GuardianSpirit {
    [Key, ForeignKey("Person")]
    public int PersonID { get; set; }
    public string Name { get; set; }
    public virtual Person Person { get; set; }
}

人员列表显示一个创建按钮,如果没有与某个人关联的守护神。当具有"上帝"角色的用户单击时,它会显示创建该人的守护精神的表单。这是截图。

如何传递人员的 ID 来创建它?(它将具有与其所有者相同的 ID)

谢谢!

将对象指定给另一个对象

1:0..1关联中,可选实体同时具有外键的主键是正常的。这是关系数据库可以做的最好的事情,以保证关联的两端完全属于彼此。

您的类正确实现了此模式:GuardianSpirit是可选(或依赖)实体,Person是独立(或主体)实体。

结果是可选实体不能自由选择/生成自己的主键。您必须在代码中设置它。有两种方法可以执行此操作:

  • 你知道Person的id:newGuardianSpirit.PersonId = person.Id
  • 您有一个Person对象:person.GuardianSpirit = newGuardianSpirit

第一个选项是可能的,因为GuardianSpirit.PersonId不会是标识列(当 EF 创建数据库时),因此其值不是由数据库生成的。

只需在新GuardianSpirit上设置Person即可。但请确保在 DbSet 上使用 Create() 方法,以便获取代理对象。这样,在设置Person时,PersonID也会自动设置。请参阅 msdn 上有关导航属性的文档。

var person = dbcontext.Person.Create();
person.FirstName = "Bob";
person.LastName = "Roberts";
person.Age = 24;
dbcontext.Person.Add(person);
// dbcontext.SaveChanges(); // person will have a new ID if it is saved here
var guardian = dbcontext.GuardianSpirit.Create();
guardian.Name = "Luke";
guardian.Person = person;
dbcontext.GuardianSpirit.Add(guardian); // If the person was saved then the PersonID should now also be set
dbcontext.SaveChanges();

数据库设计不正确,因为类 GuardianSpirit 中的 PersonID 既是外键又是主键。

问题是,现在你不能用适当的人ID创建一个守护神,因为它是守护神实体的主键。

它应该是:

public class Person {
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int PersonID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public virtual GuardianSpirit GuardianSpirit { get; set; }
}
public class GuardianSpirit {
    [ForeignKey("Person")]
    [DatabaseGenerated( DatabaseGeneratedOption.None )]
    public int PersonID { get; set; }
    public string Name { get; set; }
    public virtual Person Person { get; set; }
}

然后,您只需创建新的GuardianSpirit实例,为其命名并设置要分配的人员的PersonID。然后,可以使用实体框架将此对象添加到数据库并保存更改。

//here read person id
var personId = 5;
var guardianSpirit = new GuardianSpirit()
{
   Name = "Gabriel",
   PersonID = personId
};
//_context is DbContext
_context.GuardianSpirirts.AddObject(guardianSpirit);
_context.SaveChanges();