导航属性(Collection)一次只存储一个值

时间:2015-02-04 03:37:05

标签: c# entity-framework

我们创建了一个具有多个多对多导航属性的模型,这些属性是集合。

public class Shop
{
    public Shop()
    {
        Owners = new HashSet<ShopOwner>();
    }

    public ShopOwner Creator { get; set; }

    public int Id { get; set; }

    [Index("IX_Name", IsUnique = true)]
    [Required]
    [StringLength(100, MinimumLength = 1, ErrorMessage = "Shop name cannot be empty")]
    public string Name { get; set; }

    public virtual ICollection<ShopOwner> Owners { get; set; }

    public virtual ICollection<ShopOwner> Partners { get; set; }
}

此外,

public class ShopOwner : IdentityUser
{
    public ShopOwner()
    {
        Shops = new HashSet<Shop>();
    }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string PreferredName { get; set; }

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

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ShopOwner> manager)
    {
        ClaimsIdentity userIdentity =
            await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }
}

我们将所有者添加到这样的商店:

Shop shop = context.Shops.Find(shopId);
ShopOwner owner = userManager.FindById(User.Identity.GetUserId());

shop.Owners.Add(owner);
owner.Shops.Add(shop);

context.SaveChanges();

我们遇到的问题是,向商店的所有者添加所有者会使该用户的所有者反对该商店所有者中的唯一所有者。它不像集合那样,当我们使用SQL Server Management Studio查看数据库时,我们会看到一个名为ShopOwner_Id的列,但是商店和所有者之间没有表格或关系。

知道为什么这个集合属性可以这样表现吗?

1 个答案:

答案 0 :(得分:0)

我对此问题的起源不太确定。但仍然认为要写出与EF有多少关系。因此,您可能会遇到问题并最终解决问题。

当您在POCO模型中定义Generic集合时,它在EF中被视为多个很多关系,如上所述。

在后端,EF将生成第三个表,供您存储与以下约定的多对多关系。

TableATableB

因此,根据此惯例,您应该有一个名为ShopShopOwner或ShopOwnerShop的表(前提是您没有在任何地方覆盖任何约定和表名。)。

其定义如下所示

ShopId ShopOwnerId
  1         2
  1         3
  2         5

下面的语句将导致上表中的一行。

shop.Owners.Add(owner);

所以你不再需要在下面执行。

owner.Shops.Add(shop);

第二条声明可能导致违反ShopShopOwner表中的主键。因为EF引入的第三个表将具有复合键(ShopId和ShopOwnerId)。