EF Core 3:当SaveChanges()

时间:2019-09-27 23:23:34

标签: c# entity-framework-core

我的问题:插入拥有所有权的实体失败。

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

2 个答案:

答案 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(预览版)进行了测试,并且工作正常