2012-03-23 81 views
0

我使用EF Code First在本地。\ SQLEXPRESS上创建数据库。EF Code First to SQL Azure

等等。我有这2类:

public class Shop 
{ 
    public int ShopID { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a name!")] 
    [MaxLength(25, ErrorMessage = "Name must be 25 characters or less")] 
    public string Name { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter an address!")] 
    [MaxLength(30, ErrorMessage = "Address must be 30 characters or less")] 
    public string Address { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a valid city name!")] 
    [MaxLength(30, ErrorMessage = "City name must be 30 characters or less")] 
    public string City { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a phone number!")] 
    [MaxLength(14, ErrorMessage = "Phone number must be 14 characters or less")] 
    public string Phone { get; set; } 

    [MaxLength(100, ErrorMessage = "Description must be 50 characters or less")] 
    public string Description { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a WorkTime!")] 
    public DateTime WorkTimeBegin { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a WorkTime!")] 
    public DateTime WorkTimeEnd { get; set; } 

    public DateTime? SaturdayWorkTimeBegin { get; set; } 
    public DateTime? SaturdayWorkTimeEnd { get; set; } 
    public DateTime? SundayWorkTimeBegin { get; set; } 
    public DateTime? SundayWorkTimeEnd { get; set; } 

    public int ShoppingPlaceID { get; set; } 
    public virtual ShoppingPlace ShoppingPlace { get; set; } 

    public virtual ICollection<Category> Categories { get; set; } 
} 

public class ShoppingPlace 
{ 
    [Key] 
    public int ShopingplaceID { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a name!")] 
    [MaxLength(25, ErrorMessage = "Name must be 25 characters or less")] 
    public string Name { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter an address!")] 
    [MaxLength(50, ErrorMessage = "Address must be 50 characters or less")] 
    public string Address { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a city name!")] 
    [MaxLength(30, ErrorMessage = "City must be 30 characters or less")] 
    public string City { get; set; } 

    [Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a valid phone number!")] 
    [MaxLength(14, ErrorMessage = "Phone number must be 14 characters or less")] 
    public string Phone { get; set; } 

    public int ShoppingCenterID { get; set; } 
    public virtual ShoppingCenter ShoppingCenter { get; set; } 

    public virtual ICollection<Shop> Shops { get; set; } 
} 

和方法的DbContext:

modelBuilder.Entity<Item>() 
      .HasRequired(p => p.Category) 
      .WithMany(a => a.Items) 
      .HasForeignKey(a => a.CategoryID) 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Category>() 
      .HasRequired(a => a.Shop) 
      .WithMany(a => a.Categories) 
      .HasForeignKey(a => a.ShopID) 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Shop>() 
      .HasOptional(a => a.ShoppingPlace) 
      .WithMany(a => a.Shops) 
      .HasForeignKey(a => a.ShoppingPlaceID) 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<ShoppingPlace>() 
      .HasOptional(a => a.ShoppingCenter) 
      .WithMany(a => a.ShoppingPlaces) 
      .HasForeignKey(a => a.ShoppingCenterID) 
      .WillCascadeOnDelete(false); 

为什么我不能没有创建和填充ShopingPlace创店。如何实现这一目标?

编辑:

试图用:

modelBuilder.Entity<Shop>() 
      .HasOptional(a => a.ShoppingPlace) 
      .WithOptionalPrincipal(); 

     modelBuilder.Entity<ShoppingPlace>() 
      .HasOptional(a => a.ShoppingCenter) 
      .WithOptionalPrincipal(); 

并通过,但有什么区别?为什么在SQL Server中,我被允许在ItemCategory的情况下看到 ShoppingPlaceIDShoppingPlace_ShopingPlaceID我只看到一个?

+1

是不是因为店表有ShoppingPlaces的fk? – daryal 2012-03-23 11:18:19

+0

我编辑一点:) – Bip 2012-03-23 11:25:29

回答

3

尽管如果不查看用于创建记录实例或确切消息的代码很难说明,但可能是因为您的外键ShoppingPlaceID不可为空。

public int ShoppingPlaceID { get; set; } 
public virtual ShoppingPlace ShoppingPlace { get; set; } 

变化

public int ShoppingPlaceID { get; set; } 

public int? ShoppingPlaceID { get; set; } 

你还应该添加以下到您的OnModelCreating()函数

modelBuilder.Entity<Shop>() 
    .HasOptional(m => m.ShoppingPlace) 
    .WithMany(m=>m.someproperty) // if this is not many then change this 
    .HasForeignKey(m=>m.ShoppingPlaceID);