代码之家  ›  专栏  ›  技术社区  ›  Frédéric De Lène Mirouze

EF 3:SaveChanges()时所有者属性插入失败

  •  0
  • Frédéric De Lène Mirouze  · 技术社区  · 5 年前

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

    我有一个 Restaurant 具有 Address 拥有的财产。当我尝试创建一个新实体并插入数据库时,会在 SaveChanges :

    无法在“RestaurantId”列、表“AppRefDB”中插入值NULL。dbo。地址';列不允许空值。插入失败。

    我所做的

    我的桌子 住址 看起来像这样:

    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 餐馆 桌子

    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,我应该改变什么 餐厅 应该从中获取新创建的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: 我还测试了一个同步版本

    0 回复  |  直到 5 年前
        1
  •  0
  •   Shervin Ivari    5 年前

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

    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; }
    

    如果你在地址实体中添加了这个,你需要先创建一个餐厅,然后分别添加地址

        2
  •  0
  •   Frédéric De Lène Mirouze    5 年前

    事实上,这可能是EF3.0中的一个错误 我用EF 3.1(预览版)进行了测试,效果很好