我在SQL中创建了一个DataBase,并在Visual Studio 2012中创建了一个EDMX。它自动创建了POCO(TT)类。一切都很好看。
现在我更改表的列名。我更新了EDMX。用XML打开EDMX,一切看起来都很好。
在TT中运行自定义工具后,我看到另外创建了一个新属性,例如:
SQL table name : Student
Column name : sName
在我的POCO课程中
public int sName{ get; set; }
自动创建。
现在我将SQL中的列名更改为
Column name : studentName
我的POCO课程
public int sName{ get; set; }
public int studentName{ get; set; }
这是一个错误还是我需要做些什么来解决这个问题?
我该怎么做才能避免这种情况?
此外,如果我更改任何SQL列的数据类型并从我的EDMX设计器中的DB更新模型,则不会更新概念模型。我该怎么做?
首先,要了解您的问题,您需要知道的是EDMX文件只是一个包含3个不同部分的XML文件:
CSDL包含构成概念模型的实体和关系。 SSDL描述了您的数据库模型,MSL是2之间的映射。
“从DB更新模型”过程将更新SSDL(更改与当前数据库模式不一致的所有内容),只有在您向数据库模式添加新内容时才会修改CSDL。
这是一种非常正常的行为,因为您的概念架构可能/应该与您的数据库架构不同(除非您希望您的域模型看起来完全像DB模型,这显然不是OOP / DDD最佳实践)。
对于@Peru,解决方案是删除相关实体(不是整个EDMX!),然后执行“从DB更新模型”过程。
希望这可以帮助!
编辑:
有一个工具,不是免费的,这是一个Visual Studio插件,允许您在CSDL和SSDL文件中应用对数据库所做的更改:Huagati DBML/EDMX Tools。唯一的“免费”解决方案是删除需要更新的实体(或该实体内的正确字段)。
请记住,CSDL应该由开发人员维护,并且必须看起来像对象模型而不是数据库模型。想象一下,您在实体之间设置了继承,或者您将1个DB表拆分为2个EDMX实体,运行“从DB更新模型”不应该覆盖所有内容!
就个人而言,我打开edmx文件作为XML并找到问题节点并删除它。该文件很容易理解 - 不要害怕至少尝试一下。
只有手动编辑适用于我的项目中的视图。 (从smallint到小数(18,2))
在文本编辑器中打开.EDMX文件,找到适当的部分,然后手动更改Property Type =“...”值。
我知道我在这里有点晚了但是有一种相对简单的方法来生成POCO /从EDMX设计器更新你的DbContext。
转到设计器,右键单击空白区域,单击“从数据库更新模型”,添加/更新表。这将更新您的edmx XML。在确认您的表已添加到CSDL,SSDL和MSL部分后,右键单击解决方案资源管理器中的T4模板(<Name>.tt
,而不是<Name>.Context.tt
)并单击“运行自定义工具” - 这将生成POCO任何更新的对象。请注意,如果您要创建新实体,它们将不会添加到您的DbContext类中,您仍然必须通过在类的底部添加以下行来手动执行此操作:public virtual DbSet<Entity_Name_Goes_Here> EntityNames { get; set; }
更新Db中的字段后,查找相应的model.cs文件,然后从模型中删除这些字段。现在更新EDMX文件(从数据库更新模型)。它对我有用。