首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免NotSupportedException?

如何避免NotSupportedException?
EN

Stack Overflow用户
提问于 2019-02-25 13:46:05
回答 2查看 106关注 0票数 0

我对这篇文章进行了修改:无法在LINQ实体查询中构造实体,但我猜它与我的问题并不完全相关。

我有这样的代码:

代码语言:javascript
复制
public class Class1
{
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
        public string Prop3 { get; set; }
}

[Table("Class2")]
public class Class2
{
        [Key]
        [Column("Prop1")]
        public string Prop1 { get; set; }

        [Column("Prop2")]
        public string Prop2 { get; set; }

        [Column("Prop3")]
        public string Prop3 { get; set; }
}

并在我想使用这些方法的地方编辑方法:

代码语言:javascript
复制
using (var data = new Context())
{
    var config = data.Class2.FirstOrDefault(c => c.Prop1.Contains(some_string));
    if (config != null)
    {
        config.Prop1 = class1_instance.Prop1;
        config.Prop2 = class1_instance.Prop2;
        config.Prop3 = class1_instance.Prop3;
    }
    data.Entry(config).State = EntityState.Modified;
    data.SaveChanges();
}

所以我想得到的是简化编辑,而不是一个一个地分配每个属性,我想写一些类似于config = class1_instance;的东西。

所以我继承了Class1Class2,但是

System.NotSupportedException (实体或复杂类型"Class1“不能在Linq查询中构造)。

我该怎么处理呢?

EN

回答 2

Stack Overflow用户

发布于 2019-02-25 14:05:32

不要从实体类继承DTO类,因为EF6会将DTO视为参与某些受支持的数据库继承策略的实体。

相反,使用由DbPropertyValuesCurrentValues属性返回的DbEntityEntryCurrentValues

通过从给定对象中读取值来设置此字典的值。给定的对象可以是任意类型的。对象上任何具有与字典中属性名称匹配且可以读取的属性的属性都将被读取。其他属性将被忽略。例如,这允许从简单数据传输对象(DTO)复制属性。

例如:

代码语言:javascript
复制
Class1 source = ...;
var target = data.Class2.FirstOrDefault(...);
if (target != null)
{
    data.Entry(target).CurrentValues.SetValues(source);
    data.SaveChanges();
}

注意,目标实体已经由db上下文附加(跟踪),因此不需要将条目状态设置为Modified

票数 3
EN

Stack Overflow用户

发布于 2019-02-26 12:45:50

现在,Class1和Class2具有相同的属性。这是有意的,还是偶然的,可能是未来版本的Class2具有不在Class1中的属性吗?

在实体框架中,DbSet<...>表示数据库的表。DbSet中的类表示表中的一行。表的列是类的非虚拟属性;虚拟属性表示表之间的关系(一对多、多对多、.)

Class2表示数据库表。如果Class1应该等于Class2,那么Class1的原因是什么。如果这个等式只是现在,并且在将来的版本中它们可能是不同的,那么您将不得不一个一个地复制这些属性。

代码语言:javascript
复制
void UpdateValue(string someString, Class1 value)
{
    using (var dbContext = new DbContext())
    {
        Class2 fetchedData = dbContext.Class2.Where(...).FirstOrDefault();
        if (fetchedData != null)
        {   // data exists. Update the properties
            fetchedData.Prop1 = value.Prop1,
            fetchedData.Prop2 = value.Prop2,
            fetchedData.Prop3 = value.Prop3,

            // future version of Class2 may have properties that are not updated
            // no need to set state to modified. Entity Framework will detect the changes
            dbContext.SaveChanges();
        }
    }
}

如果您完全确定每个Class2都是一种特殊类型的Class1,那么现在和很久以后,您可能会考虑从Class1派生Class2:

代码语言:javascript
复制
class Class2 : Class1
{
    public int Id {get; set;}
    ... // properties that are in Class2, but not in Class1
}

这意味着Class1的每个非虚拟属性都由带有Classes2的表中的一列表示。

派生不会帮助您,即使您派生,您将不得不一个一个地复制属性。如果您需要多次这样做,请考虑创建一个为您复制适当值的函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54867643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档