使用导航属性的Entity Framework继承

4
我正在使用Entity Framework进行代码优先的编程方法。

enter image description here

但是我遇到了一些错误:

用户:FromRole:导航属性“User”无效。在关联类型“User_SoteAccounts”中,FromRole“User_SoteAccounts_Target”的类型“SoteAccount”必须与声明此导航属性的类型“AllegroAccount”完全匹配。
AllegroAccount_Template_Source::在关系“AllegroAccount_Template”中,角色“AllegroAccount_Template_Source”的多重性无效。因为从属角色属性不是关键属性,所以从属角色的上限多重性必须为“”。
SoteAccount_Template_Source::在关系“SoteAccount_Template”中,角色“SoteAccount_Template_Source”的多重性无效。因为从属角色属性不是关键属性,所以从属角色的上限多重性必须为“
”。

继承具有引用的类是可能的吗?

以下是类和onModelCreating:

[Table("AllegroAccounts")]
public class AllegroAccount : ShopAccountBase
{
    public string AllegroLogin { get; set; }
    public string AllegroPassword { get; set; }
    public string AllegoWebApiKey { get; set; }
    public int CountryCode { get; set; }      
}

public class ShopAccountBase : AccountBase
{
    public int TemplateForeignKey { get; set; }
    [ForeignKey("TemplateForeignKey")]
    public Template Template { get; set; }
}

public abstract class AccountBase
{
    [Key]
    public int AccountBaseId { get; set; }
    public bool IsActive { get; set; }
    public int UserForeignKey { get; set; }
    [ForeignKey("UserForeignKey")]
    public virtual User User { get; set; }
    public bool DaysCountActive { get; set; }
    public int DaysCount { get; set; }
}

public class Template 
{
    public Template()
    {
        AdditionalServices = new AdditionalServices();
        BasicServices = new BasicServices();
        TemplatePackages = new ObservableCollection<TemplatePackage>();
    }

    [Key]
    public int TemplateID { get; set; }

    public string TemplateName { get; set; }
    public TemplateKind? TemplateKind { get; set; }
    public CourierFirm? CourierFirm { get; set; }
    public int Used { get; set; }
    public virtual ICollection<TemplatePackage> TemplatePackages { get; set; }
    public string ExternalNumber { get; set; }
    public string MPKNumber { get; set; }
    public AdditionalServices AdditionalServices { get; set; }
    public BasicServices BasicServices { get; set; }
    public string Description { get; set; }
    [Column(TypeName = "datetime")]
    public DateTime? CreationDate { get; set; }
}

public class User 
{
    public User() 
    {
        DefaultReturnAddress = new Address( );
        DefaultSendingAddress = new Address( );
        PersonInfoSending = new PersonInfo( );
        PersonInfoReturning = new PersonInfo( );
        AdditionalServices = new AdditionalServices( );

        WayBillLabel = new WaybillLabel( );
        Settings = new UserSettings( );
        AllegroAccounts = new ObservableCollection<AllegroAccount>();
        InpostAccounts = new ObservableCollection<InpostAccount>();
        TbaAccounts = new ObservableCollection<TbaAccount>();
        TruckerAccounts = new ObservableCollection<TruckerAccount>();
    }

    [Key]
    public int UserId { get; set; }

    public byte[] Password { get; set; }
    public string Login { get; set; }

    public Address DefaultReturnAddress { get; set; }
    public Address DefaultSendingAddress { get; set; }

    public PersonInfo PersonInfoSending { get; set; }
    public PersonInfo PersonInfoReturning { get; set; }

    public string MPKnumReturn { get; set; }
    public string MPKnumSending { get; set; }

    public AdditionalServices AdditionalServices { get; set; }

    public float MaxLength { get; set; }
    public float MaxWidth { get; set; }
    public float MaxHeight { get; set; }
    public float MaxWeight { get; set; }

    public int FileTemplateId { get; set; }
    public string CollectiveShipmentFilePath { get; set; }

    private PermissionFlags _permissions;

    public PermissionFlags Permissions
    {
        get { return _permissions; }
        set
        {
            if (_permissions.HasFlag(value)) { _permissions &= ~value; }
            else {
                _permissions |= value;
            }
        }
    }

    public TemplatingMethod TemplatingMethod { get; set; }

    public UserSettings Settings { get; set; }

    public WaybillLabel WayBillLabel { get; }

    public ICollection<AllegroAccount> AllegroAccounts { get; set; }
    public ICollection<SoteAccount> SoteAccounts { get; set; }

    public ICollection<InpostAccount> InpostAccounts { get; set; }
    public ICollection<TruckerAccount> TruckerAccounts { get; set; }
    public ICollection<TbaAccount> TbaAccounts { get; set; }

    // this is the right property to use for modifying the collection
    public ICollection<string> AvailableMpksCollection { get; set; }

    // this is computed property for Entity Framework only, because it cannot store a collection of primitive type
    public string AvailableMpksString
    {
        get { return AvailableMpksCollection != null ? string.Join(",", AvailableMpksCollection) : null; }
        set {
            AvailableMpksCollection = !string.IsNullOrEmpty(value) ? value.Split(',').ToList( ) : new List<string>( );
        }
    }
}


modelBuilder.Entity<AllegroAccount>().HasOptional(account => account.Template).WithOptionalDependent();

modelBuilder.Entity<User>()
            .HasMany<AllegroAccount>(u => u.AllegroAccounts)
            .WithOptional(acc => acc.User)
            .HasForeignKey(acc => acc.UserForeignKey);

modelBuilder.Entity<SoteAccount>().HasOptional(account => account.Template).WithOptionalDependent();

modelBuilder.Entity<User>()
            .HasMany<SoteAccount>(u => u.SoteAccounts)
            .WithOptional(acc => acc.User)
            .HasForeignKey(acc => acc.UserForeignKey);

有人知道这是否可能,还是我应该保持平面,不像那样继承它?我问这个问题是因为这种继承会很好地适用于我的通用存储库模型。

1个回答

4
这可能是因为您在使用流畅的配置时定义了[ForeignKey]属性并配置了外键。在AccountBase中,您已经使用[ForeignKey]定义了(AllegroAccount和User)以及(SoteAccount和User)之间的链接。
对于您的Template链接,同样的情况很可能也存在 - 关系已经在ShopAccountBase级别通过[ForeignKey]属性定义 - 您不需要在流畅的配置中重新定义它。
尝试删除所有modelBuilder流畅配置条目 - 它应该仍然可以通过继承关系工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接