首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >被删除的子实体生成错误的查询?

被删除的子实体生成错误的查询?
EN

Stack Overflow用户
提问于 2014-06-11 16:42:37
回答 1查看 27关注 0票数 0

以下代码

代码语言:javascript
复制
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:

代码语言:javascript
复制
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上的位置必须足够了!

我哪里错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-12 14:19:34

这是团队做出的设计决定。我不会考虑你的立场或EF团队的战术wrong...just的选择。两者都有好处。我不会挂掉它,部分原因是删除在大多数应用程序中是不常见的,部分原因是如果性能是一个问题的话,很容易完成。

如果只想执行一个查询,请执行如下操作:

代码语言:javascript
复制
ctx.Database.ExecuteSqlCommand("delete from [dbo].[OrderDetails] where Id = @p0", 1);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24168228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档