2014-06-11 20 views
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必須足夠!

我在哪裏錯了?

+1

是Item刪除像你想要的? –

+0

是的,但我需要在刪除之前通過Id加載它,我不能只將該實體附加到上下文,然後將其刪除,這是一個無用的運行到db – tschmit007

+1

這是團隊做出的設計決策。我不會考慮你的立場或EF團隊的戰術錯誤......只是選擇。兩者都有好處。我不會掛在上面,部分原因是在大多數應用程序中刪除是不常見的,部分原因是如果性能是一個問題,則易於使用。如果你想減少到只有一個查詢'ctx.Database.ExecuteSqlCommand(「從[dbo]。[OrderDetails]刪除,其中Id = @ p0」,1);' –

回答

1

這是團隊所做的設計決定。我不會考慮你的立場或EF團隊的戰術錯誤......只是選擇。兩者都有好處。我不會掛在上面,部分原因是在大多數應用程序中刪除是不常見的,部分原因是如果性能是一個問題,則易於使用。

如果要執行只有一個查詢,做這樣的事情:

ctx.Database.ExecuteSqlCommand("delete from [dbo].[OrderDetails] where Id = @p0", 1);