我的问题:插入具有自有属性的实体失败。
我有一个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(预览版(进行了测试,它工作正常