【问题标题】:EF Core 3: owned property insert fails when SaveChanges()EF Core 3:SaveChanges() 时拥有的属性插入失败
【发布时间】: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
)

其中RestaurantIdRestaurant 表的主键和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,您可以创建导航,然后将属性添加到导航。
  • 地址不一定很多。这是一个玩具项目,我尝试测试一些新工具。但这可能是一种情况,我想了解。但无论如何,节省餐厅地址是一个很好的解决方案。该模型需要每个餐厅都有一个地址。使用自有财产甚至是执行此功能的一种方式。
  • 很好,您能提供有关您的模型的详细信息吗?
  • 我刚刚在问题中添加了我的模型

标签: c# entity-framework-core


【解决方案1】:

在这种情况下,您有一个包含地址集合的 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; }

如果您将其添加到地址实体中,您需要先创建一个餐厅,然后单独添加地址

【讨论】:

  • 这不起作用。反正我做的没什么不同
  • 哦,你的模型不支持这种方式@FrédéricDeLèneMirouze
  • @FrédéricDeLèneMirouze 我根据您的模型添加解决方案
【解决方案2】:

实际上这可能是 EF 3.0 中的一个错误 我使用 EF 3.1(预览版)进行了测试,它运行良好

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多