我在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更新模型,则不会更新概念模型。我该怎么做?
答案 0 :(得分:33)
首先,要了解您的问题,您需要知道的是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更新模型”不应该覆盖所有内容!
答案 1 :(得分:4)
就个人而言,我将edmx文件作为XML打开并找到问题节点并将其删除。该文件非常容易理解 - 不要害怕至少尝试一下。
答案 2 :(得分:0)
只有手动编辑才能在我的项目中为View工作。 (从smallint到小数(18,2))
在文本编辑器中打开.EDMX文件,找到适当的部分,然后手动更改Property Type =“...”值。
答案 3 :(得分:0)
我知道我来晚了一点,但是 是一种相对简单的方法来生成您的POCO /从EDMX设计器更新您的DbContext。
转到设计器,右键单击空白区域,单击“从数据库更新模型”,添加/更新表。这将更新您的edmx XML。确认您的表已添加到CSDL,SSDL和MSL部分后,请在解决方案资源管理器(<Name>.tt
,而非<Name>.Context.tt
)中右键单击T4模板,然后单击“运行自定义工具”-这将为任何更新的对象生成POCO。请注意,如果要创建新实体,则不会将它们添加到DbContext类中,您仍然必须通过在类的底部添加以下行来手动执行此操作:public virtual DbSet<Entity_Name_Goes_Here> EntityNames { get; set; }
答案 4 :(得分:-1)
更新Db中的字段后,找到相应的model.cs文件,然后从模型中删除这些字段。现在更新EDMX文件(从数据库更新模型)。它对我有用。