EF Core 3:保存更改() 时拥有的属性插入失败



我的问题:插入具有自有属性的实体失败。

我有一个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是主键,FK 来自Restaurant表中。

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 : 我也测试了一个同步版本

在本例中,您有一个具有地址集合的 Class 对象。

using (var context = new YourContext())
{
var model= new Restaurant{ Name = "McDonald's" };
model.addresses.Add(new addresses{ street="test",.... });
model.addresses.Add(new addresses{ street="test",.... });
context.Restaurant.Add(model);
context.SaveChanges();
}

这将解决您的问题。

您可以同时添加两个类

public ICollection<YourEntity> YourEntity{ get; set; }

或者可以使用外键。

[ForeignKey("Restaurant")]
public long RestaurantId { get; set; }
public Restaurant Restaurant{ get; set; }

如果您在地址实体中添加此内容,则需要首先创建一个餐厅,然后单独添加地址

事实上,这可能是 EF 3.0 中的一个错误 我使用 EF 3.1(预览版(进行了测试,它工作正常

最新更新