0
下面的代碼刪除子實體生成錯誤查詢?
using System;
using System.Linq;
using System.Data.Entity;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.Data.SqlClient;
using System.Reflection;
namespace testef {
public class Order {
public Int32 Id { get; set; }
public String O { get; set; }
public virtual ICollection<OrderDetail> Details { get; set; }
}
public class OrderDetail {
public virtual Order Order { get; set; }
public Int32 Id { get; set; }
public String D { get; set; }
public Boolean IsActive { get; set; }
}
public class OrderDetailConfiguration : EntityTypeConfiguration<OrderDetail> {
public OrderDetailConfiguration()
: base() {
HasRequired(d => d.Order).WithMany(o => o.Details);
}
}
public class TestEFContext : DbContext {
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> Details { get; set; }
public TestEFContext(String cs)
: base(cs) {
Database.SetInitializer<TestEFContext>(new DropCreateDatabaseAlways<TestEFContext>());
//Database.SetInitializer<TestEFContext>(null);
//Database.SetInitializer<TestEFContext>(new CreateDatabaseIfNotExists<TestEFContext>());
//Database.SetInitializer<TestEFContext>(new CustomDataBaseInitializer());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new OrderDetailConfiguration());
}
}
public class CustomDataBaseInitializer : CreateDatabaseIfNotExists<TestEFContext> {
public CustomDataBaseInitializer() : base() {
}
}
class Program {
static void Main(string[] args) {
String cs = @"Data Source=ALIASTVALK;Initial Catalog=TestEF;Integrated Security=True; MultipleActiveResultSets=True";
using (TestEFContext ctx = new TestEFContext(cs)) {
Order o = new Order {
O = "O1",
Details = new List<OrderDetail>{
new OrderDetail { D = "D11", IsActive = true},
new OrderDetail { D = "D12", IsActive = false}
}
};
ctx.Orders.Add(o);
ctx.SaveChanges();
}
using (TestEFContext ctx = new TestEFContext(cs)) {
//OrderDetail d = new OrderDetail { Id = 1};
//ctx.Details.Attach(d);
OrderDetail d = ctx.Details.Where(x => x.Id == 1).First();
ctx.Details.Remove(d);
ctx.SaveChanges();
// ==> exec sp_executesql N'DELETE [dbo].[OrderDetails] WHERE (([Id] = @0) AND ([Order_Id] = @1))',N'@0 int,@1 int',@0=1,@1=1
}
}
}
}
生成SQL語句:
exec sp_executesql N'DELETE [dbo].[OrderDetails] WHERE (([Id] = @0) AND ([Order_Id] = @1))',N'@0 int,@1 int',@0=1,@1=1
我想不通爲什麼AND ([Order_Id] = @1
。對於我來說,因爲PK是Id,所以Id必須足夠!
我在哪裏錯了?
是Item刪除像你想要的? –
是的,但我需要在刪除之前通過Id加載它,我不能只將該實體附加到上下文,然後將其刪除,這是一個無用的運行到db – tschmit007
這是團隊做出的設計決策。我不會考慮你的立場或EF團隊的戰術錯誤......只是選擇。兩者都有好處。我不會掛在上面,部分原因是在大多數應用程序中刪除是不常見的,部分原因是如果性能是一個問題,則易於使用。如果你想減少到只有一個查詢'ctx.Database.ExecuteSqlCommand(「從[dbo]。[OrderDetails]刪除,其中Id = @ p0」,1);' –