实体框架4.3.1如何创建关联

时间:2012-03-28 01:39:57

标签: entity-framework code-first

我的代码如下

public class User
{
    public int ID { get; set; }
    public int BillingAddressID { get; set; }
    public Address BillingAddress { get; set; }
    public IList<Shipment> Shipments { get; set; }
}

public class Address
{
    public int ID { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
}

public class Shipment
{
    public int ID { get; set; }
    public string State { get; set; }
    public int DeliveryAddressID { get; set; }
    public Address DeliveryAddress { get; set; }
    public User ShipUser { get; set; }
    //[ForeignKey("ShipUser")]
    public int ShipUserID { get; set; }
    //public int UserId { get; set; }
}

public class TestContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Address> Addresses { get; set; }
    public DbSet<Shipment> Shipments { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Shipment>().HasRequired(u => u.ShipUser)
            .WithMany(d => d.Shipments)
            .HasForeignKey(c => c.ShipUserID)
            .WillCascadeOnDelete(false);
    }
}
  1. 如果我删除覆盖方法,我将收到一个错误“SqlException:在表'发货'上引入FOREIGN KEY约束'FK_Shipments_Users_ShipUserID'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或者修改其他FOREIGN KEY约束。 无法创建约束。请参阅先前的错误。“
  2. 如果我在Shipment Class中删除ShipUserID,它将正常工作,当我看到由ef创建的表时,我在表Shipment中找到了一个名为Shipment_UserID的列。我不知道原因。
  3. 如果将类的indenty键重命名为UserID,它也可以正常工作。
  4. 无论如何我试试,但我不知道原因,我需要一些关于EF协会的书。

1 个答案:

答案 0 :(得分:0)

  1. 如果您没有为一个关系指定没有cascadeDelete = false的映射,那么如果您与user的{​​{1}}有两个关系,它将创建多个级联路径。 按照惯例,您可以使用公共

    Shipment

  2. 它将按惯例使用 Public User ShipUser { get; set; }
    public int ShipUserID { get; set; }
    作为外键。

    1. 如果删除ShipUserID,则需要创建自己的外键以保持关系。这是你的'Shipment_UserID'

    2. ShipUserID我不明白你的意思。

    3. Here is a good tutorial

      开头