সত্তা ফ্রেমওয়ার্ক কোরে শক্তভাবে টাইপ করা আইডি s


12

আমি একটি দৃ strongly়ভাবে টাইপ করা Idক্লাস করার চেষ্টা করছি , যা এখন অভ্যন্তরীণভাবে 'দীর্ঘ' ধারণ করে। নীচে বাস্তবায়ন। আমার সত্তাগুলিতে এটি ব্যবহার করার ফলে আমার সমস্যাটি হ'ল সত্তা ফ্রেমওয়ার্ক আমাকে একটি বার্তা দেয় যে সম্পত্তি আইডি ইতিমধ্যে এটিতে ম্যাপ করা হয়েছে। আমার IEntityTypeConfigurationনীচে দেখুন ।

দ্রষ্টব্য: আমি দৃ D়ভাবে ডিডিডি বাস্তবায়ন করার লক্ষ্য রাখছি না। সুতরাং দয়া করে মন্তব্য বা উত্তর দেওয়ার সময় এটি মনে রাখবেন । টাইপ Idকরা পেছনের পুরো আইডি হ'ল ডেভেলপারদের প্রকল্পে আসা তারা তাদের সমস্ত সত্তায় আইডি ব্যবহার করার জন্য দৃ strongly়ভাবে টাইপ করেছেন, অবশ্যই long(বা BIGINT) এ অনুবাদ করেছেন - তবে এটি অন্যদের পক্ষে স্পষ্ট।

শ্রেণি ও কনফিগারেশনের নীচে, যা কাজ করে না। রেপোটি https://github.com/KodeFoxx/Kf.CleanArchitectureTemplate.NetCore31 এ পাওয়া যাবে ,

Idশ্রেণি বাস্তবায়ন (এখনই অপ্রচলিত চিহ্নিত, কারণ আমি এর সমাধান না পাওয়া পর্যন্ত আমি ধারণাটি ত্যাগ করেছি)

namespace Kf.CANetCore31.DomainDrivenDesign
{
    [DebuggerDisplay("{DebuggerDisplayString,nq}")]
    [Obsolete]
    public sealed class Id : ValueObject
    {
        public static implicit operator Id(long value)
            => new Id(value);
        public static implicit operator long(Id value)
            => value.Value;
        public static implicit operator Id(ulong value)
            => new Id((long)value);
        public static implicit operator ulong(Id value)
            => (ulong)value.Value;
        public static implicit operator Id(int value)
            => new Id(value);


        public static Id Empty
            => new Id();

        public static Id Create(long value)
            => new Id(value);

        private Id(long id)
            => Value = id;
        private Id()
            : this(0)
        { }

        public long Value { get; }

        public override string DebuggerDisplayString
            => this.CreateDebugString(x => x.Value);

        public override string ToString()
            => DebuggerDisplayString;

        protected override IEnumerable<object> EquatableValues
            => new object[] { Value };
    }
}

EntityTypeConfigurationআইডিটি সত্তার জন্য অপ্রচলিত হিসাবে চিহ্নিত না হয়ে আমি ব্যবহার করছিলামPerson দুর্ভাগ্যজনকভাবে যদিও আইড টাইপ করার সময়, এফকোর এটি মানচিত্র করতে চাইত না ... টাইপ দীর্ঘকাল এটি কোনও সমস্যা ছিল না ... অন্য মালিকানাধীন প্রকারগুলি, যেমন আপনি দেখেন (সহ Name) ভাল কাজ।

public sealed class PersonEntityTypeConfiguration
        : IEntityTypeConfiguration<Person>
    {
        public void Configure(EntityTypeBuilder<Person> builder)
        {
            // this would be wrapped in either a base class or an extenion method on
            // EntityTypeBuilder<TEntity> where TEntity : Entity
            // to not repeated the code over each EntityTypeConfiguration
            // but expanded here for clarity
            builder
                .HasKey(e => e.Id);
            builder
                .OwnsOne(
                e => e.Id,
                id => {
                   id.Property(e => e.Id)
                     .HasColumnName("firstName")
                     .UseIdentityColumn(1, 1)
                     .HasColumnType(SqlServerColumnTypes.Int64_BIGINT);
                }

            builder.OwnsOne(
                e => e.Name,
                name =>
                {
                    name.Property(p => p.FirstName)
                        .HasColumnName("firstName")
                        .HasMaxLength(150);
                    name.Property(p => p.LastName)
                        .HasColumnName("lastName")
                        .HasMaxLength(150);
                }
            );

            builder.Ignore(e => e.Number);
        }
    }

Entity বেস ক্লাস (যখন আমি এখনও আইডি ব্যবহার করছিলাম, সুতরাং যখন এটি অপ্রচলিত হিসাবে চিহ্নিত করা হয়নি)

namespace Kf.CANetCore31.DomainDrivenDesign
{
    /// <summary>
    /// Defines an entity.
    /// </summary>
    [DebuggerDisplay("{DebuggerDisplayString,nq}")]
    public abstract class Entity
        : IDebuggerDisplayString,
          IEquatable<Entity>
    {
        public static bool operator ==(Entity a, Entity b)
        {
            if (ReferenceEquals(a, null) && ReferenceEquals(b, null))
                return true;

            if (ReferenceEquals(a, null) || ReferenceEquals(b, null))
                return false;

            return a.Equals(b);
        }

        public static bool operator !=(Entity a, Entity b)
            => !(a == b);

        protected Entity(Id id)
            => Id = id;

        public Id Id { get; }

        public override bool Equals(object @object)
        {
            if (@object == null) return false;
            if (@object is Entity entity) return Equals(entity);
            return false;
        }

        public bool Equals(Entity other)
        {
            if (other == null) return false;
            if (ReferenceEquals(this, other)) return true;
            if (GetType() != other.GetType()) return false;
            return Id == other.Id;
        }

        public override int GetHashCode()
            => $"{GetType()}{Id}".GetHashCode();

        public virtual string DebuggerDisplayString
            => this.CreateDebugString(x => x.Id);

        public override string ToString()
            => DebuggerDisplayString;
    }
}

Person(অন্যান্য মান মান সম্পর্কিত ডোমেন এবং রেফারেন্সগুলি https://github.com/KodeFoxx/Kf.CleanArchitectureTemplate.NetCore31/tree/master/Source/Core/Domain/Kf.CANetCore31.Core.Domain/People এ পাওয়া যাবে )

namespace Kf.CANetCore31.Core.Domain.People
{
    [DebuggerDisplay("{DebuggerDisplayString,nq}")]
    public sealed class Person : Entity
    {
        public static Person Empty
            => new Person();

        public static Person Create(Name name)
            => new Person(name);

        public static Person Create(Id id, Name name)
            => new Person(id, name);

        private Person(Id id, Name name)
            : base(id)
            => Name = name;
        private Person(Name name)
            : this(Id.Empty, name)
        { }
        private Person()
            : this(Name.Empty)
        { }

        public Number Number
            => Number.For(this);
        public Name Name { get; }

        public override string DebuggerDisplayString
            => this.CreateDebugString(x => x.Number.Value, x => x.Name);
    }
}

উত্তর:


3

আমি দৃ D়ভাবে ডিডিডি বাস্তবায়ন করার লক্ষ্য রাখছি না। সুতরাং দয়া করে মন্তব্য বা উত্তর দেওয়ার সময় এটি মনে রাখবেন। টাইপ করা আইডির পুরো আইডি হ'ল ডেভেলপারদের প্রকল্পে আসা তারা তাদের সমস্ত সত্তায় আইডি ব্যবহার করার জন্য দৃ strongly়ভাবে টাইপ করেছেন

তবে কেন কেবল একটি টাইপ উপন্যাস যুক্ত করবেন না:

using Id = System.Int64;

অবশ্যই, আমি ধারণা পছন্দ করি। আপনি যতবারই ".cs" ফাইলটিতে "আইডি" ব্যবহার করবেন, আপনি কি সেখানে এই বিবৃতিটি উপরে রেখে নিশ্চিত করতে হবে না - যখন একটি ক্লাস চারপাশে পাশ করা হচ্ছে, একজনের কি দরকার নেই? এছাড়াও আমি অন্যান্য বেস ক্লাসের কার্যকারিতা যেমন Id.Empty..., বা হারাতে পারি বা অন্যথায় এটি কোনও এক্সটেনশন পদ্ধতিতে প্রয়োগ করতে হবে ... আমি ভাবনা পছন্দ করি, পাশাপাশি চিন্তাভাবনা করার জন্যও x যদি অন্য কোনও সমাধান না আসে তবে আমি এটির জন্য নিষ্পত্তি করব, কারণ এটি স্পষ্টভাবে উদ্দেশ্য বলেছে।
ইয়ভেস শেল্পে

3

সুতরাং দীর্ঘ সময় অনুসন্ধান করার পরে, এবং আরও কিছু উত্তর পাওয়ার চেষ্টা করার পরে, আমি এটি খুঁজে পেয়েছি, এটি তখন। অ্যান্ড্রু লককে ধন্যবাদ

EF কোরটিতে দৃ -়ভাবে টাইপ করা আইডি: আদিম আবেগ এড়াতে দৃ -়ভাবে টাইপ করা সত্তা আইডি ব্যবহার - পার্ট 4 : https://andrewlock.net/ স্ট্রংলি-টাইপ-ids-in-ef-core- using-স্ট্রলি-typed-entity- আইডি-টু-এড়ানোর-আদিম-আবেশ-অংশ-4 /

টিএল; ডিআর / অ্যান্ড্রু এর সংক্ষিপ্ত বিবরণ এই পোস্টে আমি আপনার EF কোর সত্তাগুলিতে মান রূপান্তরকারী এবং একটি কাস্টম IValueConverterSelector ব্যবহার করে জোরালোভাবে টাইপ করা আইডি ব্যবহার করার একটি সমাধান বর্ণনা করি। EF কোর কাঠামোর ভিত্তি ValueConverterSelector আদিম ধরণের মধ্যে সমস্ত অন্তর্নির্মিত মান রূপান্তরগুলি নিবন্ধিত করতে ব্যবহৃত হয়। এই শ্রেণি থেকে প্রাপ্ত হয়ে আমরা এই তালিকায় আমাদের দৃ strongly়ভাবে টাইপ করা আইডি রূপান্তরকারীগুলি যুক্ত করতে পারি এবং আমাদের EF কোর অনুসন্ধানগুলি জুড়ে বিজোড় রূপান্তর পেতে পারি


2

আমি মনে করি আপনি ভাগ্যের বাইরে। আপনার ব্যবহারের ক্ষেত্রে অত্যন্ত বিরল। এবং EF কোর 3.1.1 এখনও ডাটাবেসের মধ্যে এসকিউএল রাখার সাথে লড়াই করছে যা সর্বাধিক বেস কেসগুলি ব্যতীত কোনও কিছুতে ভাঙা হয়নি।

সুতরাং, আপনাকে এমন কিছু লিখতে হবে যা লিনকুই গাছের মধ্য দিয়ে যায় এবং এটি সম্ভবত প্রচুর পরিমাণে কাজ এবং যদি আপনি ইএফ কোর-এ বাগগুলিতে হোঁচট খেয়ে থাকেন - যা আপনি করবেন - আপনার টিকিটের মধ্যে এটি ব্যাখ্যা করে মজা পাবেন।


আমি সম্মত হচ্ছি ব্যবহারের ক্ষেত্রে বিরল, তবে এর পেছনের ধারণাটি সম্পূর্ণ বোকা নয় আমি আশা করি ...? এটা হলে, আমাকে অনুগ্রহ করে জানাবেন। যদি নির্বোধ (তাই দূরে নয় প্রতীত, যেমন শক্তিশালী ভাবে টাইপ আইডি ডোমেইন সঙ্গে প্রোগ্রাম এত সহজ হয়), অথবা যদি আমি কোন উত্তর খুঁজে না দ্রুত আমি উপনাম ব্যবহার হতে পারে যেমন ডেভিড ব্রাউনি দ্বারা প্রস্তাবিত - (নীচে Micrososft Stackoverflow .কম / এ / 60155275/1155847 )। এখনও অন্য ব্যবহারের ক্ষেত্রে, এবং সংগ্রহগুলি এবং ইএফ কোরের লুকানো ক্ষেত্রের ক্ষেত্রে খুব ভাল, কোনও বাগ নেই, তাই আমি ভেবেছিলাম এটি আশ্চর্যজনক, অন্যথায় পণ্যটির সাথে আমার দৃ good় অভিজ্ঞতা রয়েছে।
ইয়ভেস শেল্পে

এটি প্রতি মূর্খ নয়, তবে এটি বিরলই নয় যে আমি কখনও দেখিনি যে এটি কোনও সমর্থন করে না এবং এফকোরটি এত খারাপ যে এই মুহূর্তে আমি এটিকে সরিয়ে নিয়ে ইফের দিকে ফিরে যাচ্ছি (নন কোর) কারণ আমার জাহাজ চালানো দরকার। আমার জন্য এফকোর ২.২ আরও ভাল কাজ করেছেন - কোনও খারাপ অভ্যাস হিসাবে ফলাফল ব্যবহার করি বা "আমরা আর ক্লায়েন্টের দিকটি মূল্যায়ন করি না" এমন কোনও প্রক্ষেপণ হিসাবে ৩.১ হ'ল 100% অবিচল, এমনকি যদি - 2.2 সার্ভারে নিখুঁতভাবে মূল্যায়ন করে। সুতরাং, আমি তাদের কাছ থেকে এমন স্টাফগুলিতে সময় ব্যয় করার আশা করব না - যখন তাদের মূল ফাংশনগুলি নষ্ট হয়ে গেছে। github.com/dotnet/efcore/issues/19830#issuecomment-58423234667 বিস্তারিত জানতে
টমটম

EfCore 3.1 ভাঙা, EfCore দল ক্লায়েন্টের পক্ষের আর মূল্যায়ন না করার সিদ্ধান্ত নিয়েছে তার কারণ রয়েছে, তারা আসন্ন পরিবর্তনের জন্য আপনাকে প্রস্তুত করার জন্য এমনকি এটি সম্পর্কে 2.2-তে সতর্কতা জারি করে। তবে, আমি দেখতে পাচ্ছি না যে সেই বিশেষ জিনিসটি ভেঙে গেছে। অন্যান্য সামগ্রী হিসাবে আমি মন্তব্য করতে পারি না, আমি সমস্যাগুলি দেখেছি, তবে কোনও পারফেক্ট ব্যয় ছাড়াই এগুলি কার্যকর করতে সক্ষম হয়েছি। অন্যদিকে, আমি গত 3 টি প্রোডাক্টের জন্য প্রযোজনার মধ্যে 2 টি ছিল ড্পার ভিত্তিক, একটি ইফ ভিত্তিক ... সম্ভবত আমার এটির জন্য ড্যাপার রুটে যাওয়ার লক্ষ্য রাখা উচিত, তবে নতুন দেবগণের সহজে প্রবেশের উদ্দেশ্যকে পরাস্ত করতে হবে ts :-)... আমরা দেখব.
ইয়ভেস শেল্পে

সমস্যাটি হ'ল সার্ভারের পার্শ্ব মূল্যায়ন কী of এমনকি খুব সহজ স্টাফগুলিতেও আঘাত করে যা নির্দোষভাবে কাজ করে worked এটি কার্যকর না হওয়া পর্যন্ত কার্যকারিতা ছিন্ন করে। আমরা কেবল EFCore অপসারণ এবং EF এ ফিরে যান। EF + গ্লোবাল lfiltering জন্য তৃতীয় পক্ষ = কাজের জন্য। ড্যাপারের সমস্যাটি হ'ল আমি প্রতিটি জটিল ব্যবহারকারীর সিদ্ধান্ত নেওয়া লিনকিউকে মঞ্জুরি দিয়েছি - আমি এটি বো থেকে একটি সার্ভার সাইড ক্যোয়ারিতে অনুবাদ করব। Ef 2.2 এ কাজ করেছেন, এখন পুরোপুরি উদাস।
টমটম

ঠিক আছে, আমি এখন এই github.com/dotnet/efcore/issues/19679#issuecomment-583650245 পড়েছি ... আমি কী বোঝাতে চাইছি তৃতীয় পক্ষের লাইব আপনি তখন কী ব্যবহার করছেন? আপনি ডাপার সম্পর্কে যা বলেছিলেন তা কি আপনি আবার নতুন করে বলতে পারেন, কারণ আপনি কী বোঝাতে চেয়েছিলেন তা আমি বুঝতে পারি নি। আমার জন্য এটি কাজ করেছিল, তবে এটি এমন প্রকল্পগুলি ছিল যা দলে মাত্র 2 টি দেবের সাথে কম কী ছিল - এবং অবশ্যই দক্ষতার সাথে এটির কাজ করার জন্য লেখার জন্য অনেকগুলি ম্যানুয়াল বয়লারপ্লেট ...
ইয়ভেস শেল্পে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.