[英]EF Core Cannot insert explicit value for identity column in table
我已經看到了這個問題, 這個和這個,但是以下錯誤並沒有消失:
當 IDENTITY_INSERT 設置為 OFF 時,無法在表“產品”中插入標識列的顯式值。
我試過的是:
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
此外,我試圖設置為None
:
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
T-SQL
代碼如下所示:
CREATE TABLE Orders
(
Id INT IDENTITY(1,1),
DatePlaced datetime NOT NULL,
CONSTRAINT PK_Order_Id PRIMARY KEY (Id)
)
CREATE TABLE OrderItems
(
Id INT IDENTITY(1,1),
IdOrder INT NOT NULL
CONSTRAINT FK_OrderItems_IdOrder__Orders_Id FOREIGN KEY(IdOrder) REFERENCES Orders(Id),
IdProduct INT NOT NULL
CONSTRAINT FK_OrderItems_IdProduct__Products_Id FOREIGN KEY(IdProduct) REFERENCES Products(Id),
Quantity INT NOT NULL,
TotalPrice decimal (18,2),
CONSTRAINT PK_OrderItem_Id PRIMARY KEY (Id)
)
CREATE TABLE Products
(
Id INT IDENTITY(1,1),
Name varchar(100),
CONSTRAINT PK_Product_Id PRIMARY KEY (Id)
)
model 類如下所示:
public partial class Order
{
public Order()
{
OrderItems = new HashSet<OrderItem>();
}
public int Id { get; set; }
public DateTime DatePlaced { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
}
public partial class OrderItem
{
public int Id { get; set; }
public int Quantity { get; set; }
[Column(TypeName = "decimal(18,2)")]
public decimal? TotalPrice { get; set; }
public virtual Order Order { get; set; }
public virtual Product Product { get; set; }
}
public partial class Product
{
public Product() { }
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
}
和Customer
model:
public class Customer : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}
我想要的是保存Order
和OrderItems
。 保存代碼如下:
public async Task Add(Order order)
{
order.Customer = _context.Customers.Find(order.Customer.Id);
await _context.AddAsync(order);
await _context.SaveChangesAsync();
}
和OrderService
class:
public async Task<OrderDto> Add(OrderDto orderDto)
{
var order = _mapper.Map<Order>(orderDto);
await _orderRepository.Add(order);
orderDto.Id = order.Id;
return orderDto;
}
請告訴我我做錯了什么? 請不要關閉我的問題,因為它不重復。
這種行為的原因是Automapper
創建了一個新實例,而 Entity Framework 認為 POCO 都是應該插入的新實體。
所以解決方案是Attach
現有實體附加到`DbContext. 它在此處的精彩教程中進行了描述。
所以解決方案如下所示:
public async Task Add(Order order)
{
_context.Attach(order.Customer);
foreach (var orderItem in order.OrderItems)
{
_context.Attach(orderItem.Product);
}
await _context.Orders.AddAsync(order);
}
整個代碼看起來像這樣。
服務層:
public async Task<OrderDto> Add(OrderDto orderDto)
{
var order = _mapper.Map<Order>(orderDto);
await _orderRepository.Add(order);
orderDto.Id = order.Id;
return orderDto;
}
存儲層:
public async Task Add(Order order)
{
_context.Attach(order.Customer);
foreach (var orderItem in order.OrderItems)
{
_context.Attach(orderItem.Product);
}
await _context.Orders.AddAsync(order);
}
另一種解決方案是使用_mapper.Map(sourceProperty, destinationProperty);
. 這不會更改參考。 但是,當您設置配置時,請確保忽略您不想 map 的屬性(即主鍵)。
例如在映射配置文件 class 的構造函數下:
CreateMap<SourceType, DestinationType>()
.ForMember(destination => destination.PK, options => options.Ignore());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.