2016-07-25 135 views
0

我有两个型号EF代码优先1:* 1:同款

public class A{ 
    public AID { get; set; } 

    public int? MainBID { get; set; } 
    [ForeignKey("MainBID")] 
    public B MainB { get; set; } 
} 
public class B{ 
    public int BID { get; set; } 

    public int? AID { get; set; } 
    [ForeignKey("AID")] 
    public virtual A Owner { get; set;} 
} 

之间0..1关系,我要建模的关系是一个有许多B. A可能也有一个专门指定为B(主B)。

但是我有它设置有一个很难确定的本金和使用流利的方式:

modelBuilder 
    .Entity<A>() 
    .HasOptional(x => x.MainB) 
    .WithOptionalDependent(); 

它给了我多重未在关系中的作用“A_MainB_Source“A_MainB”有效。因为“依赖角色”属性不是关键属性,所以“依赖角色”的多重性的上界必须为“*”。

我想我的麻烦是试图向EF描述这些是两个单独的关系,而不是描述前后相同的关系。任何人都可以在这里指导我吗?

编辑:添加一个活生生的例子

我都需要建模的一系列教学课程(每一个被称为“模块”)。所有“模块”代表传达该特定课程信息的网页。每个模块可以有许多“资源”(可下载的二进制文件)。

某些模块可以有一个资源,表示与网页相同的信息。正如在某些模块中可以有一个可以打印出来并消耗的资源,而不是坐在您的机器前通过网页阅读。该网页的PDF版本。

所以在上面的每个模块都有很多资源。但是每个模块都可以有一个“特殊”资源,需要单独调用以及使用其他资源的地方。

我认为只是在资源上有一个标志,表明某种资源是特殊的,但是这将允许0 .. *这不是我想要的。我认为这可能更清洁。但我迄今还没有能够与EF合作。

+0

你能给一个真实生活的例子,你正在尝试做什么? (我无法理解那种关系,A->很多B(你的模型看起来不是这样的) –

+0

@LucianBumb看到我添加的编辑 –

回答

0

这是一个工作示例:

public class Module 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public ICollection<Resource> Resources { get; set; } 
     public int? SpecialResourceId { get; set; } 
     public Resource SpecialResource { get; set; } 
    } 

    public class Resource 
    { 
     public int Id { get; set; } 
     public int? ModuleId { get; set; } 
     public Module Module { get; set; } 
     public virtual Module IsSpecialForModule { get; set; } 
    } 

    public class MyContext : DbContext 
    { 
     public virtual DbSet<Module> Modules { get; set; } 
     public virtual DbSet<Resource> Resources { get; set; } 


     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Module>() 
       .HasMany(x=>x.Resources) 
       .WithOptional(x=>x.Module) 
       .HasForeignKey(x=>x.ModuleId) 
       .WillCascadeOnDelete(false); 

      modelBuilder.Entity<Resource>() 
       .HasOptional(x=>x.IsSpecialForModule) 
       .WithOptionalDependent(x=>x.SpecialResource) 
       .WillCascadeOnDelete(false); 
     } 
    } 

如果你的特殊资源,可以特别针对许多模块,然后你的模式正在改变这样的:

public class Resource 
    { 
     public int Id { get; set; } 
     public int? ModuleId { get; set; } 
     public Module Module { get; set; } 
     public virtual ICollection<Module> IsSpecialForModules { get; set; } 
    } 

和配置。将是:

modelBuilder.Entity<Resources>() 
       .HasMany(x=>x.IsSpecialForModules) 
       .WithOptional(x=>x.SpecialResource) 
       .HasForeignKey(x=>x.SpecialResourceId) 
       .WillCascadeOnDelete(false); 
+0

如果某个资源对于很多模块可能是特殊的,那么你也需要一对多对于资源 - >模块 –

+0

这个解决方案在很多方面都很有意思。“IsSpecialForModule”导航属性是绝对必要的吗?在我的示例中,特殊资源对于特定模块来说总是特殊的 –

+0

你得到了编译错误如果你删除导航属性,没有这个道具,你不能配置关系,但像我说的一个资源,对许多模块可能是特殊的,所以事情如何配置这个关系如果你从一开始就很多模块可能有相同的特殊水库,你没有任何损失。 –