我在我的C#模型第一个项目中使用 EntityFramework 6 ,该项目使用 MySQL数据库。
一切都很好,我可以毫无问题地生成数据库。

然后,我使用设计器修改了 .edmx 文件,并开始了我遇到的问题。

  • 首先,设计人员不再更新.edmx文件的 CSDL内容 C-S映射内容部分。
    因此,我自己更新了内容,最终可以编译该项目。

  • 这是 .edmx 文件,它现在以及设计器中的外观如下:

    EDMX文件:http://pastebin.com/Xer9UyNR

    这是设计器 View 的链接:
    http://i.stack.imgur.com/Vcv9W.png
  • 第二个(也是最重要的一个),当EF试图从数据库中获取一个tinyint并将其类型更改为 bool 值时,我得到了FormatException。
  •     à ArmoireOutils.App.OnNavigateMessageHandler(OnNavigateMessage message) dans c:\Users\JB\Desktop\CodingFrance\ArmoireOutils\ArmoireOutils\App.xaml.cs:line 101System.FormatException: String was not recognized as a valid Boolean..
        à System.Boolean.Parse(String value)
        à System.String.System.IConvertible.ToBoolean(IFormatProvider provider)
        à System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
        à MySql.Data.Entity.EFMySqlDataReader.ChangeType(Object sourceValue, Type targetType)
        à MySql.Data.Entity.EFMySqlDataReader.GetValue(Int32 ordinal)
        à System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetUntypedValueDefault(DbDataReader reader, Int32 ordinal)
        à System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
        à System.Data.Entity.Core.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName)
        à lambda_method(Closure , Shaper )
        à System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
        à lambda_method(Closure , Shaper )
        à System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
        à System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.RowNestedResultEnumerator.MaterializeRow()
        à System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.RowNestedResultEnumerator.MoveNext()
        à System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.ObjectQueryNestedEnumerator.TryReadToNextElement()
        à System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.ObjectQueryNestedEnumerator.ReadElement()
        à System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.ObjectQueryNestedEnumerator.MoveNext()
        à System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
        à System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
        à System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__2[TResult](IEnumerable`1 sequence)
        à System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
        à System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
        à System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](Expression expression)
        à System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source)
        à ArmoireOutils.Services.DataService.GetCupboardByGuid(String guid) dans c:\Users\JB\Desktop\CodingFrance\ArmoireOutils\ArmoireOutils\Services\DataService.cs:line 202
    

    Here is my GetCupboardByGUID method:

    public Cupboard GetCupboardByGuid(String guid)
        {
            using (var context = new ArmoireOutilsEntities())
            {
                var cupboard = (from a in context.Cupboards
                    where a.GUID.Equals(guid)
                    select a)
                    .Include("ResidentTools")
                    .Include("Tools")
                    .Include("Users") //If I remove this, .SingleOrDefault() works fine.
                    .SingleOrDefault(); //Throw FormatException when getting the User.Active value from the database.
    
                if (cupboard != null)
                    cupboard.RefreshLists();
    
                return cupboard;
            }
        }
    

    这是我的.edmx tt生成的User类:
    public partial class User
    {
        public User()
        {
            this.Tools = new ObservableCollection<Tool>();
            this.Cupboards = new ObservableCollection<Cupboard>();
            this.Active = true;
        }
    
        public int Id { get; set; }
        public short Type { get; set; }
        public string Firstname { get; set; }
        public string LastName { get; set; }
        public string Login { get; set; }
        public short Gender { get; set; }
        public short LangId { get; set; }
        public string Photo { get; set; }
        public System.DateTime CreationDate { get; set; }
        public Nullable<System.DateTime> ModificationDate { get; set; }
        public Nullable<System.DateTime> LastConnection { get; set; }
        public Nullable<System.DateTime> DisableDate { get; set; }
        public bool Active { get; set; }
    
        public virtual Lang Lang { get; set; }
        public virtual IList<Tool> Tools { get; set; }
        public virtual IList<Cupboard> Cupboards { get; set; }
    }
    

    因此,我想EF会遍历数据库中 cupboarduser 中的所有用户(该表将用户链接到橱柜,以实现多对多关系)以及何时需要设置 Active第一个用户的值,它从数据库获取1作为字符串,然后尝试使用 System.Boolean将字符串解析为 bool 值。解析但thaat方法不支持“1”这样的数字表示正确(数据库中的字段是 tinyint(1))。

    那么,为什么EF无法理解它是tinyint,因此他不能在 System.Boolean.Parse 中使用它?

    我试图从数据库中重新生成整个 .edmx 文件=>相同的异常

    我试图从头开始重新生成整个 .edmx 文件=>相同的异常

    我不明白为什么,因为我没有修改用户模型,所以 Active 字段已经存在并且可以正常工作。

    对不起,很长的帖子,在此先感谢。

    此致,
    平民

    最佳答案

    在特定实体上配置数据类型:

    modelBuilder.Entity<User>()
                      .Property(p => p.Active)
                      .HasColumnType("bit");
    

    或一般:
    modelBuilder.Properties()
                .Where(x => x.PropertyType == typeof(bool))
                .Configure(x => x.HasColumnType("bit"));
    

    关于c# - Entity Framework MySQL tinyint(1)System.Boolean.Parse FormatException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26021287/

    10-11 02:14