Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 2个不同独立表中的基类和子类模型_C#_.net_Entity Framework - Fatal编程技术网

C# 2个不同独立表中的基类和子类模型

C# 2个不同独立表中的基类和子类模型,c#,.net,entity-framework,C#,.net,Entity Framework,我应该缓存传入的数据。我有两个模型OrderModel和OrderDetailedModel,其中OrderModel是基类,OrderDetailedModel是子类 用户首先打开订单列表-仅检索一些数据(订单模型列表)。应该缓存此列表 当用户选择一个特定的订单时,所有的信息都被保存(OrderDetailedModel),这也应该被缓存 重要的是,当再次下载列表时,我不希望缓存的OrderDetailedModel行被OrderModel覆盖。(不想清除详细信息) 我尝试创建两个不同的数据库

我应该缓存传入的数据。我有两个模型OrderModel和OrderDetailedModel,其中OrderModel是基类,OrderDetailedModel是子类

用户首先打开订单列表-仅检索一些数据(订单模型列表)。应该缓存此列表

当用户选择一个特定的订单时,所有的信息都被保存(OrderDetailedModel),这也应该被缓存

重要的是,当再次下载列表时,我不希望缓存的OrderDetailedModel行被OrderModel覆盖。(不想清除详细信息)

我尝试创建两个不同的数据库集:

public DbSet<OrderModel> Orders { get; set; }
public DbSet<OrderDetailedModel> OrderDetails { get; set; }


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<OrderDetailedModel>().Map(m =>
    {
        //m.MapInheritedProperties(); // this doesn't help either
        m.ToTable("OrderDetails");
    });

modelBuilder.Entity<OrderModel>().Map(m =>
        {
            //m.MapInheritedProperties();
            m.ToTable("Orders");
        });

}
订单详情:

{SELECT 
N'0X0X' AS [C1], 
[Extent1].[Id] AS [Id], 
... 
[Extent1].[StoreContact] AS [StoreContact], 
...
FROM  [OrderDetails] AS [Extent1]
INNER JOIN [Orders] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]}
这将导致一个错误:

var a = Entry<T>(detailedOrderObject);

您的类仍然是连接的,因为您的OrderDetailedModel类是从OrderModel派生的,并且在查询表时EF会感到困惑

也就是说,我认为您应该绝对地将它们分割成两个单独的表,如果没有其他原因,除了规范化您的数据库。要分离它,您需要在代码中包含ForeignKey属性,并停止从OrderModel派生OrderDetailedModel类

假设OrderModel:OrderDetailedModel为1:1,您将执行以下操作:

将此添加到OrderModel:

public virtual OrderDetailedModel OrderDetails { get; set; }
对于OrderDetailedModel,您可以使用以下注释(任何其他注释,如JsonProperty注释也可以保留——我只是向您展示您需要的EF注释):


让我知道它是如何工作的。

您的类仍然是连接的,因为您的OrderDetailedModel类是从OrderModel派生的,当您查询表时,EF会感到困惑

也就是说,我认为您应该绝对地将它们分割成两个单独的表,如果没有其他原因,除了规范化您的数据库。要分离它,您需要在代码中包含ForeignKey属性,并停止从OrderModel派生OrderDetailedModel类

假设OrderModel:OrderDetailedModel为1:1,您将执行以下操作:

将此添加到OrderModel:

public virtual OrderDetailedModel OrderDetails { get; set; }
对于OrderDetailedModel,您可以使用以下注释(任何其他注释,如JsonProperty注释也可以保留——我只是向您展示您需要的EF注释):


让我知道它是如何工作的。

为了防止有人需要保留继承,我发布了一个我创建的解决方案:

public class OrderModel
{
    protected bool _detailed;

    [Key, Column(Order=0), DatabaseGenerated(DatabaseGeneratedOption.None)]
    [JsonProperty(PropertyName = "order_id")]
    public int Id { get; set; }

    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public bool Detailed
    {
        get { return _detailed; }
        set
        {
            if( (this.GetType() == typeof(OrderModel) && value== true) ||
                (this.GetType() == typeof(OrderDetailedModel) && value==false))
                throw new ArgumentException("This property is restricted");
            _detailed = value;
        }
    }

    //....

    public OrderModel()
    {
        _detailed = false;
    }
}


public class OrderDetailedModel :OrderModel
{
    //.....

    public OrderDetailedModel()
    {
        _detailed = true;
    }
}

它并不漂亮,但很有效。

为了防止有人需要保留继承权,我发布了一个我创建的解决方案:

public class OrderModel
{
    protected bool _detailed;

    [Key, Column(Order=0), DatabaseGenerated(DatabaseGeneratedOption.None)]
    [JsonProperty(PropertyName = "order_id")]
    public int Id { get; set; }

    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public bool Detailed
    {
        get { return _detailed; }
        set
        {
            if( (this.GetType() == typeof(OrderModel) && value== true) ||
                (this.GetType() == typeof(OrderDetailedModel) && value==false))
                throw new ArgumentException("This property is restricted");
            _detailed = value;
        }
    }

    //....

    public OrderModel()
    {
        _detailed = false;
    }
}


public class OrderDetailedModel :OrderModel
{
    //.....

    public OrderDetailedModel()
    {
        _detailed = true;
    }
}

它不漂亮,但很管用。

你能发布订单代码和订单详细信息吗?@IronMan84当然可以。虽然我担心它们没有什么有趣的地方。请参阅编辑。您可以发布订单和订单详细信息的代码吗?@IronMan84当然可以。虽然我担心它们没有什么有趣的地方。请参见编辑。
public class OrderModel
{
    protected bool _detailed;

    [Key, Column(Order=0), DatabaseGenerated(DatabaseGeneratedOption.None)]
    [JsonProperty(PropertyName = "order_id")]
    public int Id { get; set; }

    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public bool Detailed
    {
        get { return _detailed; }
        set
        {
            if( (this.GetType() == typeof(OrderModel) && value== true) ||
                (this.GetType() == typeof(OrderDetailedModel) && value==false))
                throw new ArgumentException("This property is restricted");
            _detailed = value;
        }
    }

    //....

    public OrderModel()
    {
        _detailed = false;
    }
}


public class OrderDetailedModel :OrderModel
{
    //.....

    public OrderDetailedModel()
    {
        _detailed = true;
    }
}