1つのレコードを更新し、そのレコードに関連するエンティティを初めて追加する方法を理解し、新しく作成した外部キーで元のレコードを更新する記録。関連するエンティティを追加した後にエンティティの外部キーを更新する
たとえば、2つのテーブルがあるとします。1つは人(tbl_person)、もう1つはアドレス(tbl_address)です。
+----+------------+-----------+-----------+
| PK | First Name | Last Name | AddressFK |
+----+------------+-----------+-----------+
| 1 | Michael | Jordan | 1 |
| 2 | Lebron | James | |
+----+------------+-----------+-----------+
public int PersonID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int? AddressID { get; set; }
public virtual tbl_Address tbl_Address { get; set; }
entityBuilder
.HasOne(t => t.tbl_Address)
.WithOne(t => t.tbl_Person)
.HasForeignKey<tbl_Person>(d => d.AddressID)
.IsRequired(false);
+----+-------------------+----------+-------+
| PK | Address Line 1 | City | State |
+----+-------------------+----------+-------+
| 1 | 123 Sesame Street | New York | NY |
+----+-------------------+----------+-------+
public int AddressID { get; set; }
public string AddressLine1 { get; set; }
public string City { get; set; }
public string State { get; set; }
public virtual tbl_Person tbl_Person { get; set; }
私のアプリは、更新が必要なJSONレコードを受け取ります。
{
"address": {
"addressLine1": "789 Hollywood Ave",
"city": "Hollywood",
"state": "CA"
},
"firstname": "Lebron",
"lastname": "Brown",
"id": 2,
}
私はLebron BrownをLebron Brownに更新し、彼のアドレスを追加する必要があります。今、私は、レコードを検索し、次の操作を行い、それが個人の記録を更新し、アドレス・レコードを作成します。
var person = _db.tbl_Person
.Include(t => t.tbl_address)
.Where(t => t.Id == json.id).First();
person.firstname = json.firstname;
person.lastname = json.lastname;
if(person.tbl_Address == null)
{
person.tbl_Address = new tbl_Address() {
AddressLine1 = json.address.addressLine1,
City = json.address.city,
State = json.address.state,
};
}
db.SaveChanges();
私は人のAddressId保存、変更前に、新しく作成されたのAddressIdを等しくするためにしようとすると問題がありますそれは私に外来キー制約に関するエラーを与えます。
person.AddressID = person.tbl_Address.Id;
db.SaveChanges();
助けてください。それはそれのように自動的に子エンティティの外部キーを生成していないので、私はそれはバグかもしれないと思うし始めているので、私はEntityFrameworkコアのGithubにクロスポストしまったあなたに
をクロスポストTO
LINKありがとうございましただと思う。 GitHubの問題には、サンプルプロジェクトが添付されています(ここに示す例よりやや複雑です)。確認したい場合は、エラーを複製してください:https://github.com/aspnet/EntityFramework/issues/5833
データアノテーションまたはEntityTypeConfigurationsのいずれかを使用したクラス宣言が役立ちますが、基本的にFKを手動で更新しないのは、SaveChangesコールの前にすべてデフォルト値( 'default(int)== 0 ')それは例外があるからです。 –
これは私の問題のサンプルです。実際のテーブルにはかなり近いです。私はクラス宣言を要求通りに追加しました。 – chris
あなたの例では、 'person.tbl_Address'を設定することによって、EFはアドレスを挿入し、' Person'をすべて更新します。 –