0

如果我有一位客户进行查询(仅允许一项查询),我是否有:

public class Customer
{
    public string Name {get;set;}
    public string ContactNumber {get;set;}

    public virtual Inquiry Inquiry {get;set;}
}
public class Inquiry
{
    public string Product {get;set;}
    public string Information {get;set;}
    public string Reason {get;set;}
}

还是我有这样的:

public class Customer
{
    public string Name {get;set;}
    public string ContactNumber {get;set;}
}
public class Inquiry
{
    public string Product {get;set;}
    public string Information {get;set;}
    public string Reason {get;set;}

    public virtual Contact Contact {get;set;}
}

在第一种情况下,我很确定如果一个Inquiry被删除,Customer也会被删除,除非我使用public Guid? InquiryId {get;set;}导航属性。这种情况确实更有意义。

在第二种情况下,我很确定如果 aCustomer被删除,那么Inquiry将被删除,这是预期的效果。但它确实使导航属性有点多余,因为您想查看客户所做的customer => inquiry查询,而不是客户所做的查询inquiry.FirstOrDefault(x => x.Customer.Id.Equals(customerId))

一方面,该Delete On Cascade属性有帮助,但导航属性是多余的,但另一方面Delete On Cascade无济于事(并且需要更多代码才能使其正常工作),但导航属性很有帮助。

那么你如何决定走哪条路呢?

认为第一种情况的另一个缺点是您必须手动删除相关的Inquiry,因为当您删除它时,Customer它只会忽略级联(因为它已在代码中关闭)。

4

1 回答 1

1

将您的问题和评论中的以下信息放在一起...

  • 客户有一个查询
  • 效果是当客户被删除时,相关的查询也应该被删除
  • 您期望客户和询价之间的关系是一对一或零

...如果没有进一步的映射规范,这两个模型都不能满足这些要求。但是,您可以通过使用第一个模型并使用 Fluent API 添加显式映射来实现目标:

modelBuilder.Entity<Customer>()
    .HasOptional(c => c.Inquiry)
    .WithRequired()
    .WillCascadeOnDelete(true);

相关CustomerInquiry将共享相同的主键值,即 in 的主键Inquiry是 的外键Customer

关于一些不正确的假设的几点说明:

在第一种情况下,我很确定如果查询被删除,客户也会被删除。

这是不正确的,因为您的模型中没有外键属性,在这种情况下,EF 将假定一个可选关系并且默认情况下不启用级联删除。

在第二种情况下,我很确定如果客户被删除,则查询将被删除。

由于同样的原因不正确。

这是一对一或零(关系)。

您的第一个和第二个场景都表示一对多关系,因为如果您仅在关系的一侧具有导航属性,则这是 EF 将假定的默认关系。是否在另一侧公开集合或不使其成为一对多关系都没有关系。例如,在第一个场景中,您可能有两个客户引用同一个查询,这意味着(从概念上和从数据库的角度来看)这个查询将有两个(=许多)客户。

于 2013-08-25T13:16:25.653 回答