我的问题:插入拥有所有权的实体失败。
我有一个Restaurant
实体,拥有Address
所拥有的财产。当我尝试创建新实体并将其插入数据库时,在SaveChanges
处引发了异常:
无法将值NULL插入表'AppRefDB.dbo.Addresses'的'RestaurantId'列中;列不允许为空。 INSERT失败。
我做什么
我的桌子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
应该在插入Restaurant
之前从Address
表中获取新创建的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; }
}
Edit2: 我也测试了同步版本
答案 0 :(得分:0)
在这种情况下,您有一个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; }
如果您在地址实体中添加此地址,则需要先创建一个餐厅,然后分别添加地址
答案 1 :(得分:0)
实际上,这可能是EF 3.0中的错误 我使用EF 3.1(预览版)进行了测试,并且工作正常