首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在EF6中为双方创建一对一的关系

在EF6中为双方创建一对一的关系
EN

Stack Overflow用户
提问于 2015-05-22 16:14:57
回答 2查看 2.1K关注 0票数 4

是否有一种方法可以使用实体框架6中的fluent API来映射两个实体,使双方具有一对一的关系可选?

代码示例

代码语言:javascript
复制
// Subscription (has FK OrderId)
this.HasOptional(t => t.Order)
    .WithOptionalDependent(t => t.Subscription)
    .HasForeignKey(d => d.OrderId); // does not compile

上下文:为什么要这样做?我在一个现有的系统中工作,那里有支付订单来购买订阅。当订单得到支付时,就会创建订阅并将其关联起来,这意味着订阅是可选的。此外,还有其他创建订阅的方法,这意味着order对于订阅是可选的。

EN

回答 2

Stack Overflow用户

发布于 2015-05-22 19:29:22

通常,在一对一(或零)关系中,两个实体共享相同的PK,而在依赖关系中,PK也被指定为FK。有关此问题的更多信息,请查看此链接。但是,如果实体不共享相同的PK,则不能在依赖实体中添加FK属性。如果这样做,EF将抛出一个与多重性相关的异常,表示它必须是*。

关于关系的配置,只有一种方法可以将一对一的关系配置为可选的,这就是目前使用Fluent Api的情况。通过这种方式,还可以使用地图方法将EF按约定在从属表中创建的FK列重命名为您在DB中的Subscription表中已经拥有的名称。

更新

如果您没有绑定到现有的数据库,您可以这样做:

代码语言:javascript
复制
public class Subscription
{
    public int SubscriptionId { get; set; }

    public int? OrderId { get; set; }
    public virtual Order Order { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public int SubscriptionId { get; set; }

    public virtual Subscription Subscription { get; set; }
}

配置如下:

代码语言:javascript
复制
 modelBuilder.Entity<Subscription>()
            .HasOptional(s => s.Order)
            .WithMany()
            .HasForeignKey(s=>s.OrderId);

 modelBuilder.Entity<>(Order)
            .HasOptional(s => s.Subscription)
            .WithMany()
            .HasForeignKey(s=>s.SubscriptionId);

这样你就可以和OrderIdFK (和SubscriptionId也一样)像一对一的关系一样工作。这里的问题是,您必须分别设置和保存两个关联。

票数 1
EN

Stack Overflow用户

发布于 2015-05-22 16:27:07

请在数据库上下文类中尝试此代码。

代码语言:javascript
复制
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Subscription>()
            .HasOptional(x => x.Order)
            .WithOptionalPrincipal()
            .Map(x => x.MapKey("SubscriptionId"));

        modelBuilder.Entity<Order>()
            .HasOptional(x => x.Subscription)
            .WithOptionalPrincipal()
            .Map(x => x.MapKey("OrderId"));

    }

我的测试模型如下

代码语言:javascript
复制
public class Order
{
    [Key]
    public int OrderId { get; set; }
    public string Description { get; set; }

    public virtual Subscription Subscription { get; set; }
}
public class Subscription
{
    [Key]
    public int SubscriptionId { get; set; }

    public virtual Order Order { get; set; }
}

编辑:,我对数据库进行了反向工程,试图通过使用double 1对多个关系来达到所需的代码结构来实现您想要的工作。生成的代码如下所示。然而,这样做是个坏主意。

代码语言:javascript
复制
public partial class Order
{
    public Order()
    {
        this.Subscriptions = new List<Subscription>();
    }

    public int OrderId { get; set; }
    public string Description { get; set; }
    public Nullable<int> SubscriptionId { get; set; }
    public virtual Subscription Subscription { get; set; }
    public virtual ICollection<Subscription> Subscriptions { get; set; }
}
public partial class Subscription
{
    public Subscription()
    {
        this.Orders = new List<Order>();
    }

    public int SubscriptionId { get; set; }
    public Nullable<int> OrderId { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
    public virtual Order Order { get; set; }
}
public class OrderMap : EntityTypeConfiguration<Order>
{
    public OrderMap()
    {
        // Primary Key
        this.HasKey(t => t.OrderId);

        // Properties
        // Table & Column Mappings
        this.ToTable("Orders");
        this.Property(t => t.OrderId).HasColumnName("OrderId");
        this.Property(t => t.Description).HasColumnName("Description");
        this.Property(t => t.SubscriptionId).HasColumnName("SubscriptionId");

        // Relationships
        this.HasOptional(t => t.Subscription)
            .WithMany(t => t.Orders)
            .HasForeignKey(d => d.SubscriptionId);

    }
}
public class SubscriptionMap : EntityTypeConfiguration<Subscription>
{
    public SubscriptionMap()
    {
        // Primary Key
        this.HasKey(t => t.SubscriptionId);

        // Properties
        // Table & Column Mappings
        this.ToTable("Subscriptions");
        this.Property(t => t.SubscriptionId).HasColumnName("SubscriptionId");
        this.Property(t => t.OrderId).HasColumnName("OrderId");

        // Relationships
        this.HasOptional(t => t.Order)
            .WithMany(t => t.Subscriptions)
            .HasForeignKey(d => d.OrderId);

    }
}
public partial class EFOrdersContextContext : DbContext
{
    static EFOrdersContextContext()
    {
        Database.SetInitializer<EFOrdersContextContext>(null);
    }

    public EFOrdersContextContext()
        : base("Name=EFOrdersContextContext")
    {
    }

    public DbSet<Order> Orders { get; set; }
    public DbSet<Subscription> Subscriptions { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new OrderMap());
        modelBuilder.Configurations.Add(new SubscriptionMap());
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30401456

复制
相关文章

相似问题

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