【发布时间】:2019-10-20 22:31:41
【问题描述】:
我的问题:插入具有自有属性的实体失败。
我有一个 Restaurant 实体和 Address 拥有的属性。当我尝试创建一个新实体并插入数据库时,SaveChanges 会引发异常:
无法将值 NULL 插入“RestaurantId”列、“AppRefDB.dbo.Addresses”表;列不允许空值。插入失败。
我做了什么
我的桌子Address 是这样的:
CREATE TABLE [dbo].[Addresses]
(
[RestaurantId] INT NOT NULL,
[Number] NVARCHAR(8) NULL,
[Street] NVARCHAR(150) NOT NULL,
[Zip] NVARCHAR(10) NOT NULL,
[Town] NVARCHAR(50) NOT NULL,
[Site] NVARCHAR(150) NULL ,
CONSTRAINT [PK_Addresses]
PRIMARY KEY ([RestaurantId]),
CONSTRAINT [FK_Address_Restaurants_RestaurantId]
FOREIGN KEY ([RestaurantId]) REFERENCES [Restaurants] ([Id])
ON DELETE CASCADE
)
其中RestaurantId 是Restaurant 表的主键和FK。
和
CREATE TABLE [dbo].[Restaurants]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
[Name] NVARCHAR(50) NOT NULL,
CONSTRAINT [FK_Restaurants_TCategories]
FOREIGN KEY ([IdCategory]) REFERENCES [Categories]([Id])
)
我在OnModelCreating 中这样定义了我的属性:
modelBuilder.Entity<Restaurant>()
.OwnsOne(p => p.Address)
.ToTable("Addresses");
我这样保存:
await _dbContext.Set<Restaurant>()
.AddAsync(restaurant, cancellationToken);
_dbContext.SaveChangesAsync();
我在寻找什么
为了让 EF 理解 RestaurantId 应该在插入 Address 之前从 Restaurant 表中获取新创建的 Id,我应该进行哪些更改?
我正在使用 EF Core 3。
更新工作正常,我只是在创建新餐厅/地址时遇到问题
编辑:我的模型
public class Restaurant
{
[Key]
public int Id { get; set; }
[Required, StringLength(50)]
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
[Required, StringLength(150)]
public string Street { get; set; }
[StringLength(8)]
public string Number { get; set; }
[Required, StringLength(10)]
public string Zip { get; set; }
[Required, StringLength(50)]
public string Town { get; set; }
[StringLength(150)]
public string Site { get; set; }
}
编辑2: 我也测试了一个同步版本
【问题讨论】:
-
一个餐厅可以有多个地址?
-
或者你能添加更多关于你的模型的细节吗?您可以先创建一家餐厅,然后向其中添加地址模型。如果您使用 ef,您可以创建导航,然后将属性添加到导航。
-
地址不一定很多。这是一个玩具项目,我尝试测试一些新工具。但这可能是一种情况,我想了解。但无论如何,节省餐厅地址是一个很好的解决方案。该模型需要每个餐厅都有一个地址。使用自有财产甚至是执行此功能的一种方式。
-
很好,您能提供有关您的模型的详细信息吗?
-
我刚刚在问题中添加了我的模型