Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EntityFramework关系的方向是什么_C#_Entity Framework - Fatal编程技术网

C# EntityFramework关系的方向是什么

C# EntityFramework关系的方向是什么,c#,entity-framework,C#,Entity Framework,如果我有客户进行询价(只允许一次询价),我是否有: 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 str

如果我有客户进行询价(只允许一次询价),我是否有:

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;}
}
在第一个场景中,我很确定如果
查询
被删除,那么
客户
也会被删除,除非我使用
公共Guid?InquiryId{get;set;}
以及导航属性。这种情况确实更有意义

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

一方面,
Delete-On-Cascade
属性有帮助,但导航属性是多余的,然而另一方面,
Delete-On-Cascade
没有帮助(需要更多代码才能使其发挥作用),但导航属性有帮助

那你怎么决定走哪条路呢


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

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

  • 客户只有一个查询
  • 其效果是,当客户被删除时,相关的查询也应该被删除
  • 您希望客户和查询之间的关系是一对一或零
…如果没有进一步的映射规范,这两种模型都无法满足这些要求。但是,您可以通过使用第一个模型并使用Fluent API添加显式映射来实现这一目标:

modelBuilder.Entity<Customer>()
    .HasOptional(c => c.Inquiry)
    .WithRequired()
    .WillCascadeOnDelete(true);
modelBuilder.Entity()
.has可选(c=>c.Inquiry)
.WithRequired()
.WillCascadeOnDelete(真);
相关的
客户
查询
将共享相同的主键值,即
查询
中的主键是
客户
的外键

关于一些错误假设的几点意见:

在第一个场景中,我很确定如果查询被删除 客户也将被删除

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

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

不正确的原因是相同的

这是一对一或零(关系)


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

一个客户是否可以有多个查询?不,我会将此添加到问题中!在这种情况下,我甚至不明白第一个选项是如何工作的。你的意思是让客户有一个
IQueryable
可能吗?不。。。。它确实有效,它是一个简单的导航属性,将
inquiry\u id
字段放入
Customer
表中……客户不能在本周进行查询,下周再进行查询吗?如果是,您希望旧的查询会发生什么?它应该被删除还是只与客户“分离”?您不想为客户保留一种查询历史记录吗?