将对象指定给另一个对象
本文关键字:一个对象 对象 | 更新日期: 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();